有点乱!如果我们查看以下场景,问题可能是什么:我的目标是了解条件变量与互斥量的混合。
T1
- 锁定{互斥}
- 检查变量
- 如果未设置,则等待条件变量
- 解锁 {MUTEX} 转到 1
T2
- 修改变量;
- 信号条件变量
第 2 步和第 3 步之间可能存在竞争条件,因此我们使用 MUTEX。我不明白的是 cond var + mutex 的基本思想。
最佳答案
写端省略锁有两个问题:
- 如果您正在修改的变量不能以原子方式写入(即,它比 int 大——尽管细节取决于您使用的 CPU 架构!),您需要一个锁来确保您没有“剪”。这是当变量被中途写入时发生读取。例如,您可以将 0xAAAAAAAABBBBBBBB 写入之前为 0 的 64 位变量,而另一个线程可能只会看到 0xAAAAAAAA00000000 或 0x00000000BBBBBBBB。锁可以防止读者看到正在进行的写入,从而避免了这个问题。
- 读者可能会看到您的变量处于仍然需要等待的状态,然后在它进入休眠状态之前,作者可以更新变量并向条件变量发出信号。结果,您的线程将永远休眠。在写端锁定可以防止这种情况发生。
另请注意,条件变量的许多用途不仅仅是修改锁中的标志 - 例如,它们可以操纵链表或其他一些复杂的数据结构。在这种情况下,需要锁来保护该数据结构以及条件变量。
关于条件变量与互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235220/