假设某些条件变量“cond”与互斥变量“mutex”相关联。 如果线程在调用pthread_cond_wait(&cond,&mutex)
后在cond
上hibernate,并且另一个已锁定mutex
锁的线程完成,那么该线程在调用pthread_mutex_unlock(&mutex)
之前或之后是否调用pthread_cond_signal(&cond)
是否重要? 如果调用pthread_cond_signal(&cond)
,它是否甚至需要解锁互斥锁,因为睡眠线程无论如何都会获取互斥锁?
编辑:根据https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview ,“调用pthread_cond_signal()后未能解锁互斥锁可能不允许匹配的pthread_cond_wait()例程完成(它将保持阻塞状态)。 “ 我想那时,解锁,也许只是之后才需要。
您应该在调用pthread_cond_signal
后解锁互斥锁。 以下是一些很好的问题/答案:
在不锁定互斥锁的情况下调用pthread_cond_signal
它现在不会来找我,但我很确定有一个很好的理由(就竞争条件而言)你不想在发信号之前解锁互斥锁。
如果保持互斥锁被锁定,则被唤醒的线程无法获取互斥锁,因此将阻塞pthread_cond_wait
等待重新获取互斥锁。
您无需保持锁定互斥锁即可调用pthread_cond_signal
。 事实上,如果您的应用程序逻辑可以在互斥锁未锁定时使用信号,那么这是更好的方法 – 操作系统可以立即调度等待线程,而不必等待信号在继续之前解锁互斥锁的线程。
但是,在这种情况下,必须注意确保唤醒不会丢失,并且您不会遇到“错误”线程被唤醒的问题。 如果你使用直接谓词,这在实践中应该不是问题。
以上就是c/c++开发分享发信号通知条件变量(pthreads)相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545887.html