为什么这段代码会返回意外结果(条件变量)

时间:2018-04-05 04:50:06

标签: c linux mutex

我正在研究互斥锁。

所以,我写了关于互斥锁的测试代码。

但是这段代码有问题。

我想表明:

QMAKE_LFLAGS += -Wl

但在运行时,结果是:

downloading.....
complete....
start play!

我知道  1.为什么这段代码有错误?  2.如何修复此代码?

downloading.....
complete....

1 个答案:

答案 0 :(得分:0)

pthread-cond_signal()函数首先运行,获取互斥锁并完成所有工作(包括在释放互斥锁之前调用play()

pthread_cond_wait()线程在发送信号之前没有机会调用download(),因为play()碰巧首先获取了互斥锁。因此,当buffer有机会等待时,它已经错过了将其唤醒的信号。

修复是将条件变量与标志一起使用(可能pthread_cond_wait() - 取决于你想要实际做什么)。标志需要做几件事:

  • 在调用pthread_cond_wait()之前必须检查该标志,如果该标志表明条件已满足,则等待
  • &#34;检查标志/仅在条件尚未满足的情况下等待&#34;操作应该在循环中执行,因为void* play(void *arg) { pthread_mutex_lock(&lock); while (buffer < 1) { pthread_cond_wait(&cond, &lock); } printf("start play!\n"); --buffer; pthread_mutex_unlock(&lock); return NULL; } 可以虚假地返回(即,没有发出信号)
  • 标志检查对标志的任何更新(在任何线程中)必须在持有互斥锁的情况下完成

类似的东西(以下代码未经测试):

#!/usr/bin/env python3