pthreads中的条件变量并释放多个锁

时间:2013-10-28 21:00:59

标签: c++ c multithreading synchronization pthreads

对不起,如果这是一个微不足道的问题。但我无法在任何地方找到答案。我正在编写一个使用pthreads的程序。一个线程获取一个锁(互斥锁),然后尝试将数据推送到同步缓冲区。缓冲区有自己的互斥锁,一旦调用 push()方法就会获取该互斥锁。

如果缓冲区已满并且线程需要等待条件变量,那么等待调用是否会释放所有获取的锁?或者它只是释放与条件变量相关联的那个(恰好是最后获得的锁)?如果是后者,如果另一个线程需要获取第一个锁,我怎么能避免死锁?

修改

我遇到的问题如下。我有两个主题,比如 A B 。线程 A 有一个 for 循环,它将数据插入到多个缓冲区中。每次迭代都会将一个元素插入其中一个缓冲区中。由于这是一个线程,它会在线程的另一个外循环中连续执行此循环。当 B 被激活时,它会操纵这些缓冲区。但是,如果 A 在执行 for 循环的过程中被调度程序中断,则 B 不得对缓冲区进行操作。因此,我使用互斥锁来锁定 A 中的关键部分,这是 for 循环。

修改-2:

我一直在考虑。我的问题的答案肯定不会是缓冲区的条件变量也释放第一个锁。这意味着首先甚至不需要第一个锁。如果负责从缓冲区中删除元素的消费者线程(不同于Thread B )正在正常工作,则线程 A 将在某个时刻恢复,而 for < / em>循环将完成。因此,我的问题必须在那里。我将仔细研究并更新。

1 个答案:

答案 0 :(得分:0)

pthread_cond_wait()将仅释放您传递给它的互斥锁,在您的情况下,它将是push()调用中之前获取的缓冲区互斥锁。

听起来你的情况可能会出现僵局,但这是你的高级设计的结果。如果在线程A运行其for()循环时不允许执行线程B,但在for()循环内,线程A可能必须等待线程B消耗一些数据才能继续执行,然后死锁是不可避免的

您需要更新设计才能解决此问题。一种可能性是在同步缓冲区中添加reserve()函数,为后续push()保留空间,但不添加任何数据。然后你的线程A可以通过并保留它所需的空间而不用持有外部互斥锁(因为它还没有添加线程B可见的任何数据) - 如果它必须等待线程B消耗一些数据,它会在这里这样做。一个它保留了它所需的所有空间,然后它可以锁定外部互斥锁并推送数据 - 这保证不必等待线程B,因为空间已被保留。