首页 > 代码库 > 条件变脸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丢失问题