mon*_*ing 2 c c++ multithreading pthreads
给出条件变量的规范示例
pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);
Run Code Online (Sandbox Code Playgroud)
然后我可以从另一个线程发送一个信号,这个线程将继续.
但是我没有看到只是尝试锁定互斥锁有什么问题,如果锁定被执行,那么线程将等待互斥锁被释放.
这种方法唯一的问题是持续轮询吗?
谢谢
让我们具体化吧.您建议的条件变量替代方法是"服务员"执行此操作:
loop:
lock mutex
check predicate
if (predicate is false)
unlock mutex
sleep a bit // (is this what you had in mind?)
goto loop
Run Code Online (Sandbox Code Playgroud)
并为"信号"做到这一点:
lock mutex
make predicate true
unlock mutex
Run Code Online (Sandbox Code Playgroud)
例如,"谓词"可能是"队列不为空".
这种方法存在两个问题.第一个是您确定的:持续轮询是低效的.如果你想象整个系统中有数百或数千个线程试图以这种方式运行,那么它将使系统陷入困境.或者你的"睡一会儿"必须这么长,以至于睡眠本身会加剧令人烦恼的延迟.
第二个问题更微妙.无法保证当线程解锁互斥锁然后再次锁定它时,将允许另一个等待该互斥锁的线程运行.(互斥体的这一特性被称为"公平"的,提供它被说成是"公平"的互斥量POSIX并没有要求互斥是公平的.)不管你在"服务员"睡多长时间,有没有保证"信号发生器",将以往任何时候都闯过了lock mutex电话.
条件变量解决了这两个问题.
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |