当前位置:  技术问答>linux和unix

linux的信号灯也有惊群效应?

    来源: 互联网  发布时间:2015-08-27

    本文导语:  这里贴代码看得不好看 到这里看 http://elssann.51.net/queue.h http://elssann.51.net/queue.c 简单的说,就是我做了一个队列,ABCD线程调用getqueue_status函数阻塞住。E线程调用putqueue_status给队列里放一个东西,然后发出信号灯让A...

这里贴代码看得不好看

到这里看
http://elssann.51.net/queue.h
http://elssann.51.net/queue.c

简单的说,就是我做了一个队列,ABCD线程调用getqueue_status函数阻塞住。E线程调用putqueue_status给队列里放一个东西,然后发出信号灯让A线程返回,但是奇怪的是,在我的程序中,我竟然发现,有时候线程进去队列里取数据的时候,竟然执行到了 getqueue_status函数的这一段,
else
{
*context = NULL;
}

奇怪啊,莫非这就是所谓的信号灯惊群效应?

补充一个结构
struct queue_handle
{
int                queue_len;
sem_t              queue_sem;
pthread_mutex_t    queue_lock;
struct eph_context *context_front;
struct eph_context *context_rear;
};



|
好久没有看这个问题了,不好意思

你锁资源的时候只是判断了有没有线程在读,可是并没有判断有没有数据可读.我不知道是不是这个问题,你在自己检查一下临界资源的访问问题。

|
我没有看源代码,不过请问:你的程序对你申请的队列进行异步访问的时候是不是已经对这个临界资源进行了互斥访问。

|
接上面的帖子。
如果没有进行互斥,当已经信号唤醒一个等待条件的时候,这个等待条件上的所有睡眠进程(线程)都会被唤醒,这个可能就是你说的惊群。
当一个线程已经消费了,队列里面的数据,另一个线程又进入的话当然得不到数据,这时应当有一个信号量来保证有数据可用的时候,才允许下一个消费进程进入临界区进行访问。

|
while (1)
    {
     if (sem_wait(&q_handle->queue_sem) == 0)//首先所有线程睡眠等在这里
     {
     break;
     }
    }
pthread_mutex_lock(&q_handle->queue_lock);//唤醒后所有线程都来抢这个锁,得到的一个就继续执行,去取出队列中的数据,并且解锁返回。  但是注意这个时候其它线程就已经可以进入这段临界区,但是这个时候队列中已经没有数据可以使用了,所以自然就运行到了
else
{
*context = NULL;
}
这个地方。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 学习linux的新手问:linux进程信号掩码以及信号阻塞与信号未决怎么理解?
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • Linux下的信号忽略和信号阻塞是什么意思
  • 请高手指教 linux 信号处理问题
  • linux 信号中断
  • linux 信号 按什么键能发SIGCONT 信号??
  • linux的信号处理函数中如何访问共享资源
  • linux中 关于 进程和信号的问题
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • 关于linux内核中信号处理的问题?(信号处理的时间)
  • linux多线程信号问题
  • linux下面的信号都已经是"可靠信号"了吗,已经没有了不可靠信号?
  • linux 只有SIGUSR1和SIGUSR2,如果有多个应用程序需要信号,怎么办?
  • 在linux下怎么使用信号量?
  • 关于Linux下的信号量
  • Linux,aix,windows下可以查询非本进程的信号处理函数吗?
  • linux 下信号机制问题
  • 请问那些linux信号是不能捕捉的?
  • linux信号处理程序
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3