条件变量与互斥量

标签 c linux pthreads

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

T1

  1. 锁定{互斥}
  2. 检查变量
  3. 如果未设置,则等待条件变量
  4. 解锁 {MUTEX} 转到 1

T2

  1. 修改变量;
  2. 信号条件变量

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

最佳答案

写端省略锁有两个问题:

  1. 如果您正在修改的变量不能以原子方式写入(即,它比 int 大——尽管细节取决于您使用的 CPU 架构!),您需要一个锁来确保您没有“剪”。这是当变量被中途写入时发生读取。例如,您可以将 0xAAAAAAAABBBBBBBB 写入之前为 0 的 64 位变量,而另一个线程可能只会看到 0xAAAAAAAA00000000 或 0x00000000BBBBBBBB。锁可以防止读者看到正在进行的写入,从而避免了这个问题。
  2. 读者可能会看到您的变量处于仍然需要等待的状态,然后在它进入休眠状态之前,作者可以更新变量并向条件变量发出信号。结果,您的线程将永远休眠。在写端锁定可以防止这种情况发生。

另请注意,条件变量的许多用途不仅仅是修改锁中的标志 - 例如,它们可以操纵链表或其他一些复杂的数据结构。在这种情况下,需要锁来保护该数据结构以及条件变量。

关于条件变量与互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235220/

相关文章:

c - 双指针出现段错误

c++ - 运行 datastax 的 cpp-driver 示例时出错

c - 退出()与_退出(): Does calling _exit() ensures closing of all open fd and sockets?

php - 如何将html转换成一行字符串?

c++ - 一种检测滥用 POSIX pthreads API 而非 Helgrind 的工具

c - 如何从 pthread 返回一个数组

c - Wait() 函数导致段错误(核心转储)

c - 遍历矩阵的相邻对角线

linux - Bash "source"命令返回错误的连接字符串

C:线程程序如何在同一个单核上比非线程程序运行得更快?