返回信息流void* thread1(void* arg)
{
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void* thread2(void* arg)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
以上两个线程,如果先开thread1,然后睡眠10秒,再开线程2,为什么线程2会一直阻塞在那?难道不是thread1先设置条件变量,然后pthread_cond_wait先检查条件变量是否满足,如果满足,直接退出?这些细节不太明白,求指导!谢谢啦!
这是一条镜像帖。来源:北邮人论坛 / cpp / #85522同步于 2015/1/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]关于线程的问题
glifeng0
2015/1/30镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
条件锁是要先wait再signal把。楼主好像搞反了
【 在 glifeng0 的大作中提到: 】
: [code=c]
: void* thread1(void* arg)
: {
: ...................
嗯嗯,就是想知道先signal再wait为什么不行?
【 在 libenchao 的大作中提到: 】
: 条件锁是要先wait再signal把。楼主好像搞反了
:
你的signal都先发射了,后边wait不到信号了,肯定是一直卡在那里傻等了啊。
【 在 glifeng0 的大作中提到: 】
: 嗯嗯,就是想知道先signal再wait为什么不行?
睡十秒也没用。多线程编程千万不要依赖时间,而是依赖“ordering”。
condition是用来唤醒线程用的,它本身并不是一个“条件”。
int some_global_flag = 0;
void* thread1(void* arg)
{
pthread_mutex_lock(&mutex);
some_global_flag = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void* thread2(void* arg)
{
pthread_mutex_lock(&mutex);
while(some_global_flag != 1) {
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
}
因为对于全局变量some_global_flag的更新(除了初始化以外)都在mutex的作用下完成,所以是没有冲突的,而且下一个获得锁的线程可以看到上一个释放锁的线程写入的数据(这一点很重要,多线程的时候,一个线程写入变量的数据,另一个线程不知道什么时候可以看到,原因是缓存(cache)以及CPU间通信等问题。但如果有锁的话,可以保证“可见性”)。
假设thread1在thread2之前发生,那么while里面判断some_global_flag就已经是1了,不会去wait。假设thread2在thread1之前发生,那么thread2第一次发现some_global_flag是0,开始wait。然后thread1设置some_global_flag=1,然后把thread2唤醒。thread2再次醒来,发现some_global_flag是1,于是跳出循环。
嗯,知道了,谢谢!自己把signal函数想复杂了。
【 在 nuanyangyang 的大作中提到: 】
: 睡十秒也没用。多线程编程千万不要依赖时间,而是依赖“ordering”。
: condition是用来唤醒线程用的,它本身并不是一个“条件”。
: [code=c]
: ...................
因为在线程等待条件变量之前,互斥量一直被锁住。
如果线程发信号或广播一个条件变量,而没有线程在等待该条件变量时,则什么也没发生。
如果在这之后,有线程调用pthread_cond_wait,则它将一直等待下去而无视该条件变量刚刚被广播的事实,这意味着该线程可能永远不能被唤醒。