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

大家帮忙看看这个Linux程序为什么有问题,关于条件变量的!!

    来源: 互联网  发布时间:2015-12-11

    本文导语:  主线程pthread_cond_signal,其他线程pthread_cond_wait,但是pthread_cond_wait不能被唤醒. #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  pthread_mutex_t pool_mutex; p...

主线程pthread_cond_signal,其他线程pthread_cond_wait,但是pthread_cond_wait不能被唤醒.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

pthread_mutex_t pool_mutex;
pthread_cond_t pool_cond;

#define INITSIZE 50

pthread_t tid[INITSIZE];

void *thrmgr_worker(void *arg)
{
/* loop looking for work */
for (;;) 
{
if (pthread_mutex_lock(&(pool_mutex)) != 0) 
{
printf("!Fatal: mutex lock failedn");
exit(-2);
}
printf("before waitingn");
printf("%dn",pthread_cond_wait(&pool_cond,&pool_mutex));
                  //注意这儿,pthread_cond_wait阻塞了,pthread_cond_signal不能唤醒它,为什么

printf("after waitingn");
if (pthread_mutex_unlock(&pool_mutex) != 0) 
{

printf("!Fatal: mutex unlock failedn");
exit(-2);
}
}
return NULL;
}
int serverinit()
{
int i = 0;
for (; i  
pthread_mutex_t pool_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t pool_cond;   => 
pthread_cond_t pool_cond = PTHREAD_COND_INITIALIZER;
3, 在pthread_cond_t pool_cond;下面增加变量:
    int flag;

4, 将for (;;)改为while (flag == 0)
/* loop looking for work */
for (;;)  => while (flag == 0)

5, 在int serverinit()函数里 注释掉
pthread_mutex_init (&pool_mutex, NULL);
pthread_cond_init (&pool_cond, NULL);

6,  if (pthread_mutex_unlock(&pool_mutex) != 0) 
{

printf("!Fatal: mutex unlock failedn");
exit(-2);
}
这段代码放到while 循环外(while 是把以前的for修改成while)

7, 在printf("after waitingn");后加上 flag = 1;

8,在main函数里的pthread_cond_signal(&pool_cond);前加上一句 : flag = 1;

diff 的结果:
15a16
> #include 
17,18c18,20
 pthread_cond_t pool_cond = PTHREAD_COND_INITIALIZER;
> int flag;
27c29
     while (flag == 0)
38a41,42
>         flag = 1;
> #if 0
44a49,55
> #endif
>     }
>     if (pthread_mutex_unlock(&pool_mutex) != 0)
>     {
>
>         printf("!Fatal: mutex unlock failedn");
>         exit(-2);
60,61c71,72
     //pthread_cond_init (&pool_cond, NULL);
80a92
>         flag = 1;

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












  • 相关文章推荐
  • 关于全选的问题大家帮忙看看~
  • 我的Solaris启动不了了,请帮忙看看
  • iptables规则问题,请大家帮忙看看怎么回事
  • 各位帮忙看看网络配置问题
  • 大家帮忙看看错误如何解决
  • 高手帮忙看看cr3的值
  • 虚拟机扩容失败,下面提示的错误,帮忙看看
  • 才鸟问题,请帮忙看看
  • 那位朋友帮忙看看这是什么意思?多谢
  • 大吓帮忙看看?
  • 帮忙看看下面错误,怎样解决!!!
  • 一个200分的问题,大家帮忙看看:)谢了!关于Linux-PAM的
  • 一个shell的小问题,大家帮忙看看啊!
  • 请帮忙看看。
  • 请大家帮忙看看,编译内核后无法挂载root fs, 机器无法启动
  • 帮忙看看这是个什么错误啊?
  • 帮忙给个意见看看。
  • 大家帮忙看看,是什么问题
  • 在浏览器里连接本机的菜鸟问题,帮忙看看!
  • 请帮忙看看!!!!!!!!!!!!!!!!!!!!!
  • 努力努力再努力,帮忙帮忙来帮忙!
  • 在servlet中有一个关于单引号输出的问题,请大家帮忙,帮忙,帮帮忙!!
  • 小问题,你一定能够帮忙!——菜鸟请求帮忙!!
  • 没人帮忙吗?我想用JAVA编一个像WINDOW中的画图软件,现在出现了如下问题,请各位老哥老姐帮帮忙
  • 帮帮忙!SCO OpenServer 5.0.5 的root用户口令丢了,怎么找回来啊,帮帮忙!!!!!!
  • 我用smartupload组件遇到问题了,请帮忙!!
  • webmail问题,请高手帮忙!!!谁会使用IMP 3.0????!!!
  • 脚本问题,帮忙
  • 高手帮忙解释
  • 求教求教,shell问题...各位大哥,帮忙下
  • 关于程序移植,请知道的帮忙,分会加的


  • 站内导航:


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

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

    浙ICP备11055608号-3