条件变量与互斥量一起

时间:2011-08-29 20:00:49

标签: c linux pthreads

有点混乱!如果我们看一下以下场景可能会出现什么问题:我的目标是理解条件变量与互斥量的混合。

T1

  1. LOCK {MUTEX}
  2. 检查VARIABLE
  3. 如果没有设置,等待条件变量
  4. UNLOCK {MUTEX}转到1
  5. T2

    1. MODIFY VARIABLE;
    2. SIGNAL CONDITION VARIABLE
    3. 步骤2和3之间可能存在竞争条件,因此我们使用MUTEX。我不明白的是cond var + mutex的基本思想。

3 个答案:

答案 0 :(得分:1)

我正在猜测你的背景和你想要的行为,但我认为你希望事情看起来像这样:

T1:
锁定互斥锁
2.检查变量
3.解锁互斥锁
4.等待条件变量
5.转到1

T2:
锁定互斥锁
2.修改变量
3.解锁互斥锁
4.信号条件变量

互斥锁是为了保护对变量的访问,这样你就不会同时读取和写入不同的线程。

条件变量用于同步线程,以便您可以控制事件发生的顺序。

答案 1 :(得分:1)

在写端上省略锁定有两个问题:

  1. 如果您正在修改的变量无法以原子方式写入(即,它大于int - 虽然详细信息取决于您正在使用的CPU架构!),您需要锁定以确保您没有“剪羊毛”。这是当变量被中途写入时发生读取的时间。例如,您可以将0xAAAAAAAABBBBBBBB写入先前为0的64位变量,而另一个线程可能只能看到0xAAAAAAAA00000000或0x00000000BBBBBBBB。锁可以防止读者看到正在进行的写入,从而避免此问题。
  2. 读者可能会在仍然需要等待的状态下看到你的变量,然后在它进入睡眠状态之前,编写者可以更新变量并发出条件变量的信号。结果,你的线程永远地进入睡眠状态。在写入侧取锁可以防止这种情况发生。
  3. 另请注意,条件变量的许多用法不仅仅是修改锁中的标志 - 它们可能会操纵链接列表,例如,或其他一些复杂的数据结构。在这种情况下,需要锁来保护数据结构以及条件变量。

答案 2 :(得分:0)

你做错了。条件变量具有与之关联的互斥锁。您需要在更改变量之前锁定互斥锁,然后再将其释放。

没有死锁 - pthread_cond_wait正确地将关联的互斥锁作为参数获取,因为它可以在您以无竞赛方式阻塞时解锁互斥锁(当您在条件变量的服务器队列上时释放互斥锁,这样当你发出条件变量信号时,你就会被唤醒。