直接上代码:

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()
{
/*usleep(100000);*/
bsem_wait(&bsem);
printf("this thread[%u],is wait task2\n", pthread_self());
}
} int main()
{
printf("enter main .... \n");
int ret = ;
bsem_init(&bsem, );
pthread_t thread1[];
pthread_t thread2[]; int i;
for(i=; i< ; i++)
{
ret = pthread_create(&thread2[i], NULL,(void*)t2, NULL);
if(ret!=)
{
printf("pthread create fail");
}
} /*sleep(1);*/
/*for(i=0; i< 2; i++)*/
/*{*/
ret = pthread_create(&thread1[], NULL,(void*)t1, NULL);
if(ret!=)
{
printf("pthread create fail");
}
/*}*/
/*sleep(1);*/
ret = pthread_create(&thread1[], NULL,(void*)t1, NULL); while(); return ;
}

在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丢失问题的更多相关文章

  1. Linux 线程 条件变量

    一:条件变量 直接上最基本的两个函数,先抓主要矛盾: //等待条件 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex ...

  2. Linux互斥锁、条件变量和信号量

    Linux互斥锁.条件变量和信号量  来自http://kongweile.iteye.com/blog/1155490 http://www.cnblogs.com/qingxia/archive/ ...

  3. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

  4. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    1.Linux“线程” 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身只有进程的概念,而其所谓的“线程” ...

  5. linux 线程的同步 二 (互斥锁和条件变量)

    互斥锁和条件变量 为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护 ...

  6. posix 条件变量与互斥锁 示例生产者--消费者问题

    一.posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行. 在pthr ...

  7. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  8. 第四十章 POSIX条件变量

    条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了 例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中.这种情况就需要用到条件 ...

  9. 解决vue页面刷新或者后退参数丢失的问题

    原文链接: 点我 在商城类的项目中,会经常遇到列表数据筛选查询的情景,当要打开某一项的详情页或者暂时离开列表页,再返回(后退时),选择的筛选条件会全部丢失,辛辛苦苦选择好的条件全没了,还得重新选择,如 ...

随机推荐

  1. C++泛型编程(1)--自己实现C++迭代器/遍历器 iterator

    1.原理 迭代器又称为遍历器,用于访问容器中的数据,迭代器旨在算法和容器之间搭建访问的桥梁,从而使算法和数据分离,不用关心数据具体的存储细节.具体的原理描述请参考以下两个博客: [1].C++迭代器 ...

  2. Zookeeper学习笔记——2 Shell和Java API的使用

    ZooKeeper的使用一般都接触不到,因为平时工作甚少直接使用ZK.但是通过手动操作一下ZK,还是能对其中的门道了解各一二. shell 常用命令 help 查看所有支持的命令 [zk: local ...

  3. JDBC(3)—ResultSet结果集

    简介:ResultSet:结果集.封装了使用JDBC进行查询的结果.Statement只能进行更新操作,所以使用ResultSet进行查询操作. 1.调用Statement对象的executeQuer ...

  4. Go语言第一深坑:interface 与 nil 的比较

    interface简介 Go 语言以简单易上手而著称,它的语法非常简单,熟悉 C++,Java 的开发者只需要很短的时间就可以掌握 Go 语言的基本用法. interface 是 Go 语言里所提供的 ...

  5. 详解SpringMVC中Controller的方法中参数的工作原理

    Spring MVC中Controller的处理方法的参数可以是Integer,String,自定义对象,ServletRequest,ServletResponse,ModelAndView等等,非 ...

  6. python emoji 表情过滤

    http://my.oschina.net/jiemachina/blog/189460 注意替换的这些emoji是标准的表情字符,每个表情本来是2个字节,替换成字符串后,每个表情就变成12个字符了, ...

  7. vmware虚拟机环境下配置centos为静态IP的步骤

    一.修改centos配置文件 配置文件位于/etc/sysconfig/network-scripts/ifcfg-eth0 修改的内容为: ONBOOT=yes BOOTPROTO=static I ...

  8. Swift Precondition 预处理

    前言 precondition 和 assert 的格式类似,也是动态的,precondition 会造成程序的提前终止并抛出错误信息. 1.Precondition precondition 在一般 ...

  9. EF+LINQ事物处理

    在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作同一条数据的同一个字段的话, ...

  10. openwrt 水星mw4530r-v1 搞搞搞

    感觉周围最实用的搞硬件非路由器莫属,可惜配置都不咋的高,选择水星这款就是看中它的性价比和openwrt的支持,真乃刷机神器啊,还可以挂载usb就更绝了,价格没得说. 另外128mb的rom对大部分功能 ...