0

我有函数 lock()、unlock()、query1()、query2() 和 query3()。查询函数只是在数据库上运行一些查询,可以被认为是对它的读/写访问。他们不锁定。我的系统是多线程的。

我想要的功能是:如果从线程 p1 调用 lock(),则只有来自线程 p1 的查询将运行,来自所有其他线程的查询等待解锁。我该怎么做呢?

我正在使用 C 中的 pthreads。为此,线程必须知道它持有锁。但是 pthreads 没有这样的功能。

设计错了吗??

编辑:

Function1(){
lock();
query1();
query2();
doQuery3();
unlock();
}

doQuery3(){
lock();
query3();
unlock();
}

我希望 lock() 的行为是,如果线程已经持有该锁,它不应该等待锁。它应该只是运行。问题是我的 lock() 函数实际上启动了一个事务。我想在事务中运行一堆东西。并且 unlock() 结束事务。我希望能够链接查询。一种解决方法是在 Function1() 中调用 query3() 而不是 doQuery3(); 这意味着每个函数都有两个版本,一个带有锁定功能,一个带有普通查询()

同样,这些锁定和解锁功能可能是也可能不是互斥锁。我尝试使用 pthread mutex 实现它,但不能。因为 pthread_mutex_lock 在同一个线程块上!有什么炫酷的技巧吗??

4

4 回答 4

2

是的,你的设计是错误的。

锁定应该发生在数据库中。

于 2009-06-14T03:06:05.310 回答
1

我不确定我是否理解您的问题/设计,但是......

我想要的功能是:如果从线程 p1 调用 lock(),则只有来自线程 p1 的查询将运行,来自所有其他线程的查询等待解锁。我该怎么做呢?

如果p1线程调用的工作单元是这样的……

void doQuery1()
{
  //get the lock
  //if someone else has the lock, block until it's released
  lock();

  //now we have the lock
  //do query
  query1();

  //our work is done
  //release the lock, let another thread run
  unlock();
}

...和其他线程调用的工作相似...

void doQuery2()
{
  lock();
  query2();
  unlock();
}

void doQuery3()
{
  lock();
  query3();
  unlock();
}

...那么如果 p1 有锁,那么因为其他线程在尝试查询之前也总是调用锁函数,并且因为锁函数等待解锁,那么我认为这就是你问题的答案:结果是查询从其他线程将等待解锁(即因为所有线程总是调用锁,并且因为锁等待解锁)。

于 2009-06-14T03:34:49.233 回答
0

好吧,看来您正在寻找锁定和解锁的实现?以下是如何实现临界区的概述。但您可以使用它来实现您的功能:

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
queryN(); // critical section
pthread_mutex_unlock(&mutex);

如果仅从您的单个程序访问数据库,它将为您工作。我认为,如果您的查询正在执行 r/w,那么无论如何,您的数据库都会根据需要对表/行进行锁定。

如果您的所有查询都被锁定和解锁所包围,那么您将实现您想要的。

于 2009-06-14T04:04:20.270 回答
0
  • 如果您的数据库正在处理锁。SQL 数据库,则事务显式启动或从第一个 SQL 语句开始,并在提交工作时结束。如果您使用共享数据,您只需同步(例如使用队列)您的程序。

  • 如果您的数据库未处理锁,则必须使用锁,如:

    START_TRANSACTION = pthread_mutex_lock

    END_TRANSACTION = pthread_mutex_unlock

但是没有回滚处理,也没有防止不一致。

于 2009-06-14T08:13:41.343 回答