pthread_cond_signal惊群现象

时间:2022-10-26 00:05:33

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惊群现象的更多相关文章

  1. Redis 利用锁机制来防止缓存过期产生的惊群现象-转载自 http&colon;&sol;&sol;my&period;oschina&period;net&sol;u&sol;1156660&sol;blog&sol;360552

    首先,所谓的缓存过期引起的“惊群”现象是指,在大并发情况下,我们通常会用缓存来给数据库分压,但是会有这么一种情况发生,那就是在一定时间 内生成大量的缓存,然后当缓存到期之后又有大量的缓存失效,导致后端 ...

  2. Nginx中的惊群现象解决方法

    *什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ...

  3. Nginx学习之一-惊群现象

    惊群问题(thundering herd)的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连 ...

  4. 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 ...

  5. Linux网络编程&OpenCurlyDoubleQuote;惊群”问题总结

    1.前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬.如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进 ...

  6. epoll 惊群处理

    #include <sys/types.h> #include <sys/socket.h> #include <sys/epoll.h> #include &lt ...

  7. epoll&lowbar;wait惊群问题

    项目接入层用的模型是,主线程创建listenfd,传入6个子线程,每个子线程一个事件循环,epoll_wait这个listenfd. 如果是listenfd,则epoll_wait返回调用accept ...

  8. Linux惊群效应详解

    Linux惊群效应详解(最详细的了吧)   linux惊群效应 详细的介绍什么是惊群,惊群在线程和进程中的具体表现,惊群的系统消耗和惊群的处理方法. 1.惊群效应是什么?        惊群效应也有人 ...

  9. accept与epoll惊群 转载

    今天打开 OneNote,发现里面躺着一篇很久以前写的笔记,现在将它贴出来. 1. 什么叫惊群现象 首先,我们看看*对惊群的定义: The thundering herd problem occ ...

随机推荐

  1. EventBus框架在Android多Pane&lpar;Fragment&rpar;中的应用

    通常多pane的设计中,比如Fragment A是个Headline,Fragement B是detail,那么B通常需要实现A的点击事件的接口,这样子的话,两个fragment就高耦合了,而且需要在 ...

  2. leetcode&commat; &lbrack;322&rsqb; Coin Change &lpar;Dynamic Programming&rpar;

    https://leetcode.com/problems/coin-change/ You are given coins of different denominations and a tota ...

  3. 用javascript操作xml

    用javascript操作xml 可以使用标准DOM操作. IE创建XML MSXML2.0DOMDocument function createXMLDOM(){ var version = [ ' ...

  4. matlab的二维卷积操作

    MATLAB的conv2函数实现步骤(conv2(A,B)): 其中,矩阵A和B的尺寸分别为ma*na即mb*nb ① 对矩阵A补零,第一行之前和最后一行之后都补mb-1行,第一列之前和最后一列之后都 ...

  5. C&num; 语言规范&lowbar;版本5&period;0 &lpar;第1章 介绍&rpar;

    1. 介绍 C#(读作“See Sharp”)是一种简洁.现代.面向对象且类型安全的编程语言.C# 起源于 C 语言家族,因此,对于 C.C++ 和 Java 程序员,可以很快熟悉这种新的语言.C# ...

  6. ASM的备份集在文件系统上恢复测试

    背景:最近时常有客户咨询这类问题,其实很简单一个操作,但由于每个人的理解差异,也容易出现各种问题或者误解,本文主要总结下这个过程以及常遇到的问题处理. 环境:Site A(Oracle RAC 11. ...

  7. Android项目实战(五十三):判断网络连接是否为有线状态(tv项目适配)

    一般对于android手机,我们可以通过sdk提供的方法判断网络情况 /** * 获取当前的网络状态 :没有网络-0:WIFI网络1:4G网络-4:3G网络-3:2G网络-2 * 自定义 * * @p ...

  8. Android App性能测试之一:简介

    1.性能测试 启动时间,主要测试App在启动过程中的耗时情况 CPU, 主要测试App在使用过程中的CPU占比率 流量,主要测试App在使用过程中对流量的消耗情况 电量,主要测试App在使用过程中对电 ...

  9. 墨者学院——密码学加解密实训&lpar;Base64转义&rpar;

    地址:https://www.mozhe.cn/bug/detail/SW5ObnVFa05vSHlmTi9pcWhRSjRqZz09bW96aGUmozhe 在靶场中找到内容 解密 访问直接得key

  10. 脚本加密http&colon;&sol;&sol;www&period;datsi&period;fi&period;upm&period;es&sol;~frosal&sol;sources&sol;

    shc的官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/ 安装: 复制代码 代码如下: tar xzvf shc-.tgz cd shc- mkd ...