pthread_cond_signal惊群现象
1.如下代码所示:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h> pthread_mutex_t count_lock;
pthread_cond_t count_ready;
int count; void *decrement_count(void *arg)
{
while()
{
pthread_mutex_lock(&count_lock);
printf("decrement:waiting\n");
/*等待满足条件,期间互斥量仍然可用*/
// while (count == 0)
pthread_cond_wait(&count_ready, &count_lock);
printf("decrement:count = %d\n", count);
if (count == )
{
printf("exit count:%d\n",count);
exit();
}
count = ;
pthread_mutex_unlock(&count_lock);
}
pthread_exit(NULL);
}
void *increment_count(void *arg)
{
while()
{
pthread_mutex_lock(&count_lock);
// printf("increment:running\n");
count = ;
/*通知线程条件已满足*/
// printf("increment:count = %d\n", count);
pthread_cond_signal(&count_ready);
pthread_mutex_unlock(&count_lock);
}
pthread_exit(NULL);
} int main()
{
pthread_t tid1,tid2,tid3;
count=;
pthread_mutex_init(&count_lock, NULL);
pthread_cond_init(&count_ready, NULL); pthread_create(&tid1, NULL, decrement_count, NULL);
sleep();
pthread_create(&tid3, NULL, decrement_count, NULL);
sleep();
pthread_create(&tid2, NULL, increment_count, NULL);
/*等待decrement退出*/
pthread_join(tid2, NULL);
printf("decrement quit\n");
pthread_join(tid3, NULL);
pthread_join(tid1, NULL);
return ;
}
g++ -g thread-cond.cpp -lpthread -o test 编译出test程序。
然后运行,可见程序
decrement:waiting
decrement:waiting
decrement:count = 1
decrement:waiting
decrement:count = 0
exit count:0
最后退出了,为什么?
如果把tid1,tid2,tid3表示为每个线程获得互斥锁,那么这种情况的发生说明tid1和tid3顺序获得锁执行了(顺序也可能为tid3和tid1).
单从pthread_cond_signal函数的定义上看,如果严格的只发一个"信号"给指定一个线程,这种情况是绝对不可能发生的。
因为函数中pthread_cond_wait的返回代表了此线程接受到“信号”(pthread_cond_wait执行包括1.解锁2.wait3.获得锁4.返回)
只有一个原因能解释:pthread_cond_signal一次唤醒了2个wait线程,第1个获得锁的线程把count置为0,第2个线程发现count=0直接exit,
pthread_cond_signal发生了惊群现象。
怎么预防:
while (count == 0)
pthread_cond_wait(&count_ready, &count_lock); 在wait返回后加一个while来判断“条件”是否满足要求。
pthread_cond_signal惊群现象的更多相关文章
- Redis 利用锁机制来防止缓存过期产生的惊群现象-转载自 http://my.oschina.net/u/1156660/blog/360552
		首先,所谓的缓存过期引起的“惊群”现象是指,在大并发情况下,我们通常会用缓存来给数据库分压,但是会有这么一种情况发生,那就是在一定时间 内生成大量的缓存,然后当缓存到期之后又有大量的缓存失效,导致后端 ... 
- Nginx中的惊群现象解决方法
		*什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ... 
- Nginx学习之一-惊群现象
		惊群问题(thundering herd)的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连 ... 
- Accept 惊群现象测试perl脚本
		$uname -a Linux debian-11-34 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) x86_64 G ... 
- Linux网络编程“惊群”问题总结
		1.前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬.如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进 ... 
- epoll 惊群处理
		#include <sys/types.h> #include <sys/socket.h> #include <sys/epoll.h> #include < ... 
- epoll_wait惊群问题
		项目接入层用的模型是,主线程创建listenfd,传入6个子线程,每个子线程一个事件循环,epoll_wait这个listenfd. 如果是listenfd,则epoll_wait返回调用accept ... 
- Linux惊群效应详解
		Linux惊群效应详解(最详细的了吧) linux惊群效应 详细的介绍什么是惊群,惊群在线程和进程中的具体表现,惊群的系统消耗和惊群的处理方法. 1.惊群效应是什么? 惊群效应也有人 ... 
- accept与epoll惊群 转载
		今天打开 OneNote,发现里面躺着一篇很久以前写的笔记,现在将它贴出来. 1. 什么叫惊群现象 首先,我们看看维基百科对惊群的定义: The thundering herd problem occ ... 
随机推荐
- LoadRunner 11 安装步骤
			loadrunner 安装步骤: LoadRunner11下载: 在网上可以搜索到,在这个就不提供了. LoadRunner11原理: 破解方法和以前版本相同,我用的是LR8.0的破解文件,同样实用 ... 
- expdp 报The value (30) of MAXTRANS parameter ignored错误的原因诊断
			在使用expdp导出一个表的数据时遇到了下面情况,也不见其提示报错信息,一下子就执行完了,也没有导出我需要的数据 [oracle@getlnx01 dump_dir]$ expdp system/xx ... 
- Linux   No volume control GStreamer plugins and/or devices found
			案例环境:Oracle Linux Server release 5.7 进入Oracle Linux系统后,在右上角点击声音图标时,则会弹出如下报错窗口: The volume control di ... 
- SSDB安装配置记录
			SSDB的性能很突出,与Redis基本相当了,Redis是内存型,容量问题是弱项,并且内存成本太高,SSDB针对这个弱点,使用硬盘存储,使用Google高性能的存储引擎LevelDB,适合大数据量处理 ... 
- 【转载】 Java线程面试题 Top 50
			Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ... 
- Linux的概念与体系
			作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我在这一系列文章中阐述Linux的基本概念.Linux操作系统继承自UNIX.一个 ... 
- nginx $document_uri 防止死循环
			$document_uri 表示访问的url 现在我的需求是,访问 www.xxx.com 请求到 www.xxx.com/bbs/ 在nginx配置文件中加入 if ($document_uri ! ... 
- Hibernate组件映射
			Hibernate联合主键映射以及组件映射 在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学 ... 
- 人民币符号在html的显示方法
			之前做页面的时候碰到一个问题——人民币符号 (¥) 的显示问题,IE6下特别明显. font-size:12px;的时候显示没有问题,但是一旦大于12px就会显示异常. 于是上网查了一下看有什么方法不 ... 
- vc++2013中使用MySQL connector/C++ 1.1.4静态链接报错
			包含头文件 #include <mysql_connection.h> #include <mysql_driver.h> #include <cppconn/state ... 
