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

mutex的疑问

    来源: 互联网  发布时间:2016-11-02

    本文导语:  代码如下,输出在最后,我看了一下输出觉得有点不对劲,为什么两个线程都能同时拥有mymutex? #include      #include      #include      #include      #include    pthread_cond_t mycond;      pthread_mutex_t mymutex;   ...

代码如下,输出在最后,我看了一下输出觉得有点不对劲,为什么两个线程都能同时拥有mymutex?


#include     
#include     
#include     
#include     
#include
  
pthread_cond_t mycond;     
pthread_mutex_t mymutex;     
  
void *myfun1(void *)     
{     
timespec     mytime;  
    mytime.tv_sec     =     time(NULL)+5;             
    mytime.tv_nsec     =     0; 

    struct tm* stNowTime;
    time_t tNowTime;
int     ret;     
    pthread_mutex_lock(&mymutex);


time(&tNowTime);
stNowTime = localtime(&tNowTime);
printf("Now the time is %02d:%02d:%02d in thread %d.n",stNowTime->tm_hour,stNowTime->tm_min,stNowTime->tm_sec,pthread_self()); 

ret = pthread_cond_timedwait(&mycond, &mymutex,(const struct timespec *)&mytime);     
  
if(   ETIMEDOUT   == ret    )     
{     
printf( "Timeout in thread %d.n",pthread_self());    
                      
time(&tNowTime);
stNowTime = localtime(&tNowTime);
printf("Now the time is %02d:%02d:%02d in thread %d.n",stNowTime->tm_hour,stNowTime->tm_min,stNowTime->tm_sec,pthread_self());

pthread_mutex_unlock(&mymutex);     
 
}     

return 0;     
                          
}     

void *myfun2(void *)     
{     
timespec     mytime;  
    mytime.tv_sec     =     time(NULL)+5;             
    mytime.tv_nsec     =     0; 

    struct tm* stNowTime;
    time_t tNowTime;
int     ret;     
    pthread_mutex_lock(&mymutex);


time(&tNowTime);
stNowTime = localtime(&tNowTime);
printf("Now the time is %02d:%02d:%02d in thread %d.n",stNowTime->tm_hour,stNowTime->tm_min,stNowTime->tm_sec,pthread_self()); 

ret = pthread_cond_timedwait(&mycond, &mymutex,(const struct timespec *)&mytime);     
  
if(   ETIMEDOUT   == ret    )     
{     
printf( "Timeout in thread %d.n",pthread_self());    
                      
time(&tNowTime);
stNowTime = localtime(&tNowTime);
printf("Now the time is %02d:%02d:%02d in thread %d.n",stNowTime->tm_hour,stNowTime->tm_min,stNowTime->tm_sec,pthread_self());

pthread_mutex_unlock(&mymutex);     
 
}     

return 0;     
                          
}     

  
int main()     
{        
pthread_t     mythread1,mythread2;     

pthread_cond_init(&mycond,NULL);     
pthread_mutex_init(&mymutex,NULL);     

pthread_create(&mythread1,NULL,myfun1,NULL);        
pthread_create(&mythread2,NULL,myfun2,NULL);     

pthread_join(mythread1,NULL);     
pthread_join(mythread2,NULL);        

return     0;     
}



输出如下:

Now the time is 17:59:44 in thread 258.
Now the time is 17:59:44 in thread 515.
Timeout in thread 515.
Now the time is 17:59:49 in thread 515.
Timeout in thread 258.
Now the time is 17:59:49 in thread 258.



|
pthread_cond_timedwait() 执行时,会首先对mutex解锁,返回后对mutex再次加锁。
并不是两个线程同时拥有mutex

另外,lz你两个函数的逻辑都一样,不用定义两个函数
可以简化
pthread_create(&mythread1,NULL,myfun1,NULL);        
pthread_create(&mythread2,NULL,myfun1,NULL);

让两个线程执行同一个函数就行了

|



这个才是正解

pthread_cond_timewait()会首先内部解锁一次。。

你这个pthread_cond_timewait()用错了。。


    
 
 

您可能感兴趣的文章:

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












  • 相关文章推荐
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • init_MUTEX_LOCKED和init_MUTEX的区别是什么?
  • 请问pthread_mutex_lock()和pthread_mutex_unlock()可不可以用于对不同进程的线程进行同步。
  • 请问怎么防止pthread_mutex_lock锁定一个被另一个线程已经锁定的mutex变量时出现死锁?谢谢
  • pthread_mutex
  • pthread_mutex_destroy()调用失败的原因
  • 关于pthread_mutex_lock的问题,请教各位
  • 有关 mutex和内核抢占的问题
  • 初始化pthread_mutex_t变量的问题?????
  • 请教:pthread_mutex_lock()后加sleep(1)=解锁?
  • linux下进程同步有mutex吗?
  • linux下的进程如何访问另外一个进程建立的mutex?
  • PTHREAD_MUTEX_INITIALIZER的问题
  • 能不能查看获取pthread_mutex_t的线程id?
  • volatile 与 mutex的问题
  • linux里的条件变量到底有什么用?感觉和mutex差不多啊
  • 多线程问题,pthread_mutex_trylock,很简单的函数,为什么总是失败呢?请大侠指教!
  • C++中,为什么执行pthread_mutex_lock()时执行了两次线程才被阻塞?
  • pthread_mutex_lock互斥量问题
  • # define PTHREAD_MUTEX_INITIALIZER { { 0, 0, 0, 0, 0, 0, { 0, 0 } } } 看不懂
  • 临界区 pthread_mutex_t


  • 站内导航:


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

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

    浙ICP备11055608号-3