我正在研究互斥锁。
所以,我写了关于互斥锁的测试代码。
但是这段代码有问题。
我想表明:
QMAKE_LFLAGS += -Wl
但在运行时,结果是:
downloading.....
complete....
start play!
我知道 1.为什么这段代码有错误? 2.如何修复此代码?
downloading.....
complete....
答案 0 :(得分:0)
pthread-cond_signal()
函数首先运行,获取互斥锁并完成所有工作(包括在释放互斥锁之前调用play()
。
pthread_cond_wait()
线程在发送信号之前没有机会调用download()
,因为play()
碰巧首先获取了互斥锁。因此,当buffer
有机会等待时,它已经错过了将其唤醒的信号。
修复是将条件变量与标志一起使用(可能pthread_cond_wait()
- 取决于你想要实际做什么)。标志需要做几件事:
pthread_cond_wait()
之前必须检查该标志,如果该标志表明条件已满足,则等待 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