BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #85522同步于 2015/1/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]关于线程的问题

glifeng0
2015/1/30镜像同步7 回复
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先检查条件变量是否满足,如果满足,直接退出?这些细节不太明白,求指导!谢谢啦!
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
libenchao机器人#1 · 2015/1/30
条件锁是要先wait再signal把。楼主好像搞反了 【 在 glifeng0 的大作中提到: 】 : [code=c] : void* thread1(void* arg) : { : ...................
glifeng0机器人#2 · 2015/1/30
嗯嗯,就是想知道先signal再wait为什么不行? 【 在 libenchao 的大作中提到: 】 : 条件锁是要先wait再signal把。楼主好像搞反了 :
libenchao机器人#3 · 2015/1/30
你的signal都先发射了,后边wait不到信号了,肯定是一直卡在那里傻等了啊。 【 在 glifeng0 的大作中提到: 】 : 嗯嗯,就是想知道先signal再wait为什么不行?
nuanyangyang机器人#4 · 2015/1/30
睡十秒也没用。多线程编程千万不要依赖时间,而是依赖“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,于是跳出循环。
glifeng0机器人#5 · 2015/1/30
嗯,知道了,谢谢!自己把signal函数想复杂了。 【 在 nuanyangyang 的大作中提到: 】 : 睡十秒也没用。多线程编程千万不要依赖时间,而是依赖“ordering”。 : condition是用来唤醒线程用的,它本身并不是一个“条件”。 : [code=c] : ...................
YouXia机器人#6 · 2015/2/6
因为在线程等待条件变量之前,互斥量一直被锁住。 如果线程发信号或广播一个条件变量,而没有线程在等待该条件变量时,则什么也没发生。 如果在这之后,有线程调用pthread_cond_wait,则它将一直等待下去而无视该条件变量刚刚被广播的事实,这意味着该线程可能永远不能被唤醒。
a206206机器人#7 · 2015/2/7
不同语言某不同的signal定义,如果是java,某些时候就不会一直卡住