博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条件变脸pthread_cond_signal丢失问题
阅读量:6231 次
发布时间:2019-06-22

本文共 1562 字,大约阅读时间需要 5 分钟。

直接上代码:

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等待。

转载地址:http://mxqna.baihongyu.com/

你可能感兴趣的文章
重温JS基础--JS中的对象属性
查看>>
慕课网_《RxJava与RxAndroid基础入门》学习总结
查看>>
CDH的hadoop与Spark套件组安装
查看>>
构建多层感知器神经网络对数字图片进行文本识别
查看>>
Git常规配置与基本用法
查看>>
写Laravel测试代码(三)
查看>>
JS判断数组重复
查看>>
埋点进化论:从埋点到无埋点
查看>>
【175天】黑马程序员27天视频学习笔记【Day06-10复习脑图】
查看>>
Edraw Max(亿图图示)教程:如何自定义组织结构图展示的信息
查看>>
【PHP】一种实现多进程的方式
查看>>
前端周刊第54期:Prepack 引发社区小高潮
查看>>
如何在 K8S 中配置私有 DNS 区域和上游 NS
查看>>
Spring下扫描特定包下特定注解的类并动态注册bean
查看>>
全面解读Math对象及位运算
查看>>
AngularJS 1.x 实现进销存系统感悟与反思
查看>>
Nodejs爬虫--抓取豆瓣电影网页数据(下)
查看>>
js变量提升与函数提升的机制
查看>>
MIT开发新加密货币,用户所需数据比比特币减少99%
查看>>
RedHat宣布支持Azure、.Net Core 2.0和SQL Server 2017
查看>>