首页 > 代码库 > 条件变脸pthread_cond_signal丢失问题
条件变脸pthread_cond_signal丢失问题
直接上代码:
static bsem_t bsem;void* t1(void *arg){ /*printf("enter task 1\n");*/ /*while(1)*/ /*{*/ /*sleep(2);*/ bsem_post(&bsem); /*bsem_post_all(&bsem);*/ /*printf("this is task1, post sem\n");*/}void* t2(void *arg){ /*printf("enter task 2\n");*/ while(1) { /*usleep(100000);*/ bsem_wait(&bsem); printf("this thread[%u],is wait task2\n", pthread_self()); }}int main(){ printf("enter main .... \n"); int ret = 0; bsem_init(&bsem, 0); pthread_t thread1[2]; pthread_t thread2[5]; int i; for(i=0; i< 2; i++) { ret = pthread_create(&thread2[i], NULL,(void*)t2, NULL); if(ret!=0) { printf("pthread create fail"); } } /*sleep(1);*/ /*for(i=0; i< 2; i++)*/ /*{*/ ret = pthread_create(&thread1[0], NULL,(void*)t1, NULL); if(ret!=0) { printf("pthread create fail"); } /*}*/ /*sleep(1);*/ ret = pthread_create(&thread1[0], NULL,(void*)t1, NULL); while(1); return 0;}
在main函数中会先创建两个wait thread, 然后在创建两个post线程,运行多次会发现pthread_cond_signal丢失的显现,如下图:
可以发现执行post的条件是获取mutex, 这个mutex是所有情况大家都共用的,所以就会存在可能:
wait 和 post都在等待这个mutex, 某些时候wait获取锁不及时,被两个连续的post获取mutex两次,然后执行啦两次signal,但是只出发了一个wait等待。
wait只知道被触发,但是它并不知道是被第几个signal触发的。
修改如下,解决此问题:
增加count的计数。
条件变脸pthread_cond_signal丢失问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。