我正在尝试了解条件变量。我想知道使用条件变量的常见情况有哪些。
一个示例是在阻塞队列中,其中有两个线程访问队列 - 生产者线程将一个项目推入队列,而消费者线程从队列中弹出一个项目。如果队列为空,则消费者线程将等待,直到生产者线程发送信号。
还有哪些其他设计情况需要使用条件变量?
不过,我更喜欢基于经验的示例,例如实际应用程序中的示例。
条件变量的一种用途是“共享锁”,它比消息队列稍微复杂一些,其中不同的线程正在等待具有相同基本性质的细微不同的条件。例如,您有一个(非常简陋、简化的)网络缓存。缓存中的每个条目都有三种可能的状态:不存在、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
我在实践中使用该模式来实现 POSIX 函数的变体pthread_once
无需调度程序的任何帮助。我不能使用信号量或锁的原因once_control
,并且只是在锁下进行初始化,函数不允许失败,并且once_control
仅进行了简单的初始化。对于这个问题,pthread_once
本身没有定义的错误代码,因此实现它可能会失败并不会给你的调用者留下任何好的选择......
当然,对于这种模式,您必须小心缩放。每次初始化完成时,每个等待线程都会醒来以获取锁。因此,当您设计系统时,您会非常仔细地考虑分片,然后决定在看到经过验证的性能问题之前,您不会费心做任何实际实现它的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)