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

pthread_cond_signal唤醒有延时?

    来源: 互联网  发布时间:2017-03-24

    本文导语:  有n个线程: pthread_mutex_lock(&mutex); while(status == free){    pthread_cond_wait(&condition,&mutex); } pthread_mutex_unlock(&mutex); 都在等待被唤醒。 还有一个线程收到请求后 pthread_mutex_lock(&mutex); status = free pthread_cond_signal(&condition); p...

有n个线程:
pthread_mutex_lock(&mutex);
while(status == free){
   pthread_cond_wait(&condition,&mutex);
}
pthread_mutex_unlock(&mutex);

都在等待被唤醒。

还有一个线程收到请求后
pthread_mutex_lock(&mutex);
status = free
pthread_cond_signal(&condition);
pthread_mutex_unlock(&mutex);


同时还有一个线程:
pthread_mutex_lock(&mutex);
status = locked
pthread_mutex_unlock(&mutex);

但是我发现唤醒有延时,经常会发生signal没有唤醒wait的线程 status却被改回locked情况,请教这是什么情况

|


线程调度在内核里就是进程调度,很多原因决定调度哪个进程优先,所以就算衔signal也不一定第一种先运行

比如第三种线程休眠的时间更久,那他很有可能会先被调度

|
这样是有可能会被改成locked,因为pthread_cond_signal唤醒某个等待线程并unlock了互斥锁之后,在系统还没有来得及调度到被唤醒的等待线程前,你第三种修改状态为locked的线程先被调度了,系统的调度顺序是不可确定的.

其实你这样设计有点问题, 条件变量本来只用于等待和唤醒二种线程,现在你突然加进了第三种线程绕过了条件变量,自然会和你预期不符

|

同意,线程调度跟楼主说的“先signal 再修改为lock”没关系,跟系统有关系。有些系统是让等待时间长的线程先加锁的。例如:如果第二种线程先申请pthread_mutex_lock(&mutex),然后是第三种,然后是第一种(pthread_cond_wait激活时也有加锁的动作)。这样就会先执行按照这个顺序执行,第二种->第三种->第一种。

|
用sleep等待吧

    
 
 

您可能感兴趣的文章:

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












  • 相关文章推荐
  • pthread_cond_signal和pthread_cond_wait两个函数是怎么意思?
  • pthread_cond_signal 段错误
  • pthread_cond_signal(&empty);//这句不执行,下句pthread_mutex_unlock(&lock);也跟着不执行?
  • linux下的线posix线程,pthread_cond_signal(wait?)怎么是这样的?


  • 站内导航:


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

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

    浙ICP备11055608号-3