条件变脸pthread_cond_signal丢失问题

Posted Magnum Programm Life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件变脸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触发的。

在这个条件变量的实现中,V=1的时候才会触发成功,V=0会执行wait动作, 所以当:
V=1, wait, V=0  --> V=1,wait, V=0 这种是我们希望得到的顺序,但是也有上面的那种可能就是:
V=1, V=1, wait, V=0 -> wait,  知道等待新的Post把V置为1,才会继续向下执行。

 

修改如下,解决此问题:

增加count的计数。这个时候这个bsem就像是semphore的功能,但并不是完全是, V的值表示会触发多少个wait等待。

以上是关于条件变脸pthread_cond_signal丢失问题的主要内容,如果未能解决你的问题,请参考以下文章

条件变量

pthread_cond_signal() 没有给信号线程足够的时间运行

pthread_cond_wait 和 pthread_cond_signal 的性能

Linux中 条件变量为啥要用互斥锁来保护?

Linux:pthread_cond_signal() 在 Signal Handler() 中不起作用

使用 pthread_cond_signal 的优雅线程终止证明有问题