jas*_*ine 15 c++ multithreading condition-variable
我正在尝试了解条件变量.我想知道使用条件变量的常见情况.
一个示例是在阻塞队列中,其中两个线程访问队列 - 生产者线程将项目推入队列,而使用者线程从队列中弹出一个项目.如果队列为空,则消费者线程正在等待,直到生产者线程发送信号.
您需要使用条件变量的其他设计情况是什么?
我更喜欢基于经验的例子,例如真实应用程序中的例子.
条件变量的一种用途是“共享锁”,它比消息队列稍微复杂一些,其中不同的线程正在等待具有相同基本性质的细微不同的条件。例如,您有一个(非常简陋、简化的)网络缓存。缓存中的每个条目都有三种可能的状态:不存在、IN_PROGRESS、COMPLETE。
getURL:
lock the cache
three cases for the key:
not present:
add it (IN_PROGRESS)
release the lock
fetch the URL
take the lock
update to COMPLETE and store the data
broadcast the condition variable
goto COMPLETE
COMPLETE:
release the lock and return the data
IN_PROGRESS:
while (still IN_PROGRESS):
wait on the condition variable
goto COMPLETE
Run Code Online (Sandbox Code Playgroud)
我在实践中使用该模式来实现 POSIX 函数的变体,而pthread_once无需调度程序的任何帮助。我无法使用信号量或锁 per once_control,而只能在锁下进行初始化的原因是该函数不允许失败,并且once_control只进行了简单的初始化。就此而言,pthread_once它本身没有定义的错误代码,因此实现它可能会失败并不会给您的调用者留下任何好的选择......
当然,对于这种模式,您必须小心缩放。每次完成初始化时,每个等待线程都会醒来以获取锁。因此,当您设计系统时,您会非常仔细地考虑分片,然后决定在看到经过验证的性能问题之前,您不会费心做任何实际实现它的事情。
| 归档时间: |
|
| 查看次数: |
6459 次 |
| 最近记录: |