zoukankan      html  css  js  c++  java
  • 条件变脸pthread_cond_signal丢失问题

    直接上代码:

    static bsem_t bsem;
    void* t1(void *arg)
    {
        /*printf("enter task 1
    ");*/
        /*while(1)*/
        /*{*/
            /*sleep(2);*/
            bsem_post(&bsem);
            /*bsem_post_all(&bsem);*/
            /*printf("this is task1, post sem
    ");*/
    
    }
    
    void* t2(void *arg)
    {
        /*printf("enter task 2
    ");*/
        while(1)
        {
            /*usleep(100000);*/
            bsem_wait(&bsem);
            printf("this thread[%u],is wait task2
    ", pthread_self());
        }
    }
    
    int main()
    {
        printf("enter main .... 
    ");
        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等待。

  • 相关阅读:
    小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载一(PhoneGap中的API)
    有一种蓝,是神往,是心醉,是心伤
    persits.jpeg 水印组件
    SD卡操作相关的工具SDCardUtils
    apollo 消息分发源代码分析
    tcp ip协议笔记(1)——简单介绍
    百度地图SDK调试SDKInitializer.initialize(getApplicationContext())错误
    一气呵成编完代码的感觉对不正确
    多线程编程1-NSThread
    VIP的转移
  • 原文地址:https://www.cnblogs.com/biglucky/p/6347981.html
Copyright © 2011-2022 走看看