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

pthread_cond_wait 没起作用?

    来源: 互联网  发布时间:2016-12-27

    本文导语:  #include  #include  #include  class CMythread { public: CMythread() { Init(); } int Init() { m_bExit = false; int ret = 0; ret = pthread_cond_init(&m_tCond, NULL); ret = pthread_cond_init(&m_tCond, NULL); return ret; } ~CMythread() { } void SetCmd() {...

#include 
#include 
#include 


class CMythread
{
public:
CMythread()
{
Init();
}

int Init()
{
m_bExit = false;
int ret = 0;
ret = pthread_cond_init(&m_tCond, NULL);
ret = pthread_cond_init(&m_tCond, NULL);

return ret;
}
~CMythread()
{

}

void SetCmd()
{
pthread_cond_signal(&m_tCond);
printf("发送信号n");
}
void Excute()
{
int ret = 0;
while(!m_bExit)
{
printf("进入 pthread_cond_wait 等待n");
ret = pthread_cond_wait(&m_tCond, &m_mutex);
if( EINVAL == ret )
{
printf("== EINVALn");
}
printf("等待结束 excute a cmdn");
}

}

void SetExit(bool exit)
{
m_bExit = exit;
}
static void * Run( void *arg )
{
CMythread *pthread = (CMythread*)arg;
pthread->Excute();
return NULL;
}
pthread_t CreateThread()
{
int ret = pthread_create(&m_handle, NULL, Run, this);
printf("create return %dn", ret);
usleep(10000);//10毫秒
return m_handle;
}
protected:
pthread_t m_handle;

pthread_cond_t m_tCond;
pthread_condattr_t m_tCondAttr;
pthread_mutex_t m_mutex;

bool m_bExit;
};


    CMythread  th1;
    th1.CreateThread();
    th1.SetCmd();

|
条件变量的使用需要加锁的,只要你想用cond_wait,不管你的互斥量有没有用,都要锁住.

你这里情况 while(!m_bExit) 中的m_bExit就是一个共享变量,理应加锁,就算你访问它时候不想加锁,那也起码要让m_bExit加上volatile声明,并且把你的wait用锁包起来。

就变成下面这个样子了:

volatile bool m_bExit;

    void Excute()
    {
        int ret = 0;
        while(!m_bExit)
        {
            printf("进入 pthread_cond_wait 等待n");
            pthread_mutex_lock(&m_mutex);
            ret = pthread_cond_wait(&m_tCond, &m_mutex);
            pthread_mutex_unlock(&m_mutex);
            if( EINVAL == ret )
            {
                printf("== EINVALn");
            }
            printf("等待结束 excute a cmdn");
        }

    }

|

volatile bool m_bExit;

  void Excute()
  {
  int ret = 0;
  pthread_mutex_lock(&m_mutex);
  while(!m_bExit)
  {
      printf("进入 pthread_cond_wait 等待n");
  
      ret = pthread_cond_wait(&m_tCond, &m_mutex);
  
      if( EINVAL == ret )
      {
          printf("== EINVALn");
      }
      
      printf("等待结束 excute a cmdn");
  }
  pthread_mutex_unlock(&m_mutex);
  }

好像应该把锁锁在while外面吧

|
pthread_cond_wait前后要加锁。

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












  • 相关文章推荐
  • 关于pthread_cond_wait的几个问题
  • pthread_attr_init()及pthread_cond_wait使用疑惑
  • pthread_cond_signal和pthread_cond_wait两个函数是怎么意思?
  • ~如何GDB调试因pthread_cond_wait()阻塞的线程??~
  • 浙ICP备11055608号-3 iis7站长之家
  • 关于pthread_cond_wait函数
  • pthread_cancel和pthread_cond_wait
  • 关于pthread_cond_wait的一个简单问题!
  • pthread_cond_wait的一个迷惑
  • 线程广播信号,pthread_cond_wait却仍在等待。
  • pthread_cond_wait() 用法深入分析


  • 站内导航:


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

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

    浙ICP备11055608号-3