需要互斥锁来保护条件变量

Aqu*_*irl 3 mutex pthreads condition-variable

据说需要Mutex来保护条件变量.

这里引用的是实际条件变量声明为pthread_cond_t
OR
的正常共享变量,count其值决定信令并等待.

Mic*_*urr 6

在这里引用声明为pthread_cond_t的实际条件变量或正常的共享变量count,其值决定信号并等待?

两者都是参考.

互斥体使得count可以检查共享变量(在您的问题中),并且如果该变量的值不满足期望条件,则内部执行的等待pthread_cond_wait()将相对于该检查以原子方式发生.

使用互斥锁解决的问题是您有两个需要原子的独立操作:

  1. 检查条件 count
  2. pthread_cond_wait()如果条件尚未满足则等待insode .

A pthread_cond_signal()不会'持久' - 如果没有线程在等待pthread_cond_t对象,则信号什么都不做.因此,如果没有互斥体使上面列出的两个操作相对于彼此处于原子状态,您可能会发现自己处于以下情况:

  • 线程A想要做一次count非零的事情
  • 线程B将在其递增时发出信号count(将设置count为零以外的其他值)

    1. 线程"A"检查count并发现它为零
    2. 在"A"调用之前pthread_cond_wait(),线程"B"出现并递增count到1并调用pthread_cond_signal().该调用实际上没有任何后果,因为"A"还没有等待pthread_cond_t对象.
    3. "A"调用pthread_cond_wait(),但由于不记住条件变量信号,它将在此时阻塞并等待已经过去的信号.

互斥体(只要所有线程都遵循规则)使得项目#2不能在第1项和第3项之间发生.线程"B"有机会增加的唯一方法count是在A查看之前count或之后"A"已在等待信号.