为什么条件变量需要锁定(因此也需要静音)

Why does a condition variable need a lock (and therefore also a mutex)

本文关键字:条件 变量 锁定 为什么      更新时间:2023-10-16

条件变量是C 11的方面之一,我仍然在努力。根据我收集的条件变量,变量与信号量非常相似。

但是,再次,信号量不需要锁才能函数。条件变量确实可以。又有一个锁需要一个静音。因此,为了使用信号量相当简单的功能,我们现在不仅需要管理条件变量。还有一个静音和锁。

那么为什么条件变量需要这个呢?以及通过添加此要求提供了什么添加功能?

条件变量通常用于发出状态变化。通常需要一个静音来进行变化,并且以下信号原子。

信号量与信号机制一起封装了某些状态(标志或计数器)。条件变量更原始,仅提供信号。

通常,一旦您发出信号变更(通过条件变量),您需要运行一些代码才能处理该更改,并且该代码必须安全地读取更改的数据。如果您没有与CV关联的锁,那么您的线程在CV上可能会醒来,然后尝试(并且失败)获取与数据关联的锁定,因此必须再次产生。使用简历/锁组合组合,基础系统只有在线程可以获取相关锁定并更有效的情况下,才能将线程唤醒。

它本身不可能单独使用简历,因为它没有给出以上发出信号的数据。如果您想象使用简历 - 例如与生产者和消费者的线程安全链接列表,则您的变量代表{list, cv, lock}。在这种情况下,您取锁,突变列表,释放锁,然后向简历发出信号。在您的消费者线程上,您很可能需要一旦发出信号才能在列表上采取行动,因此,一旦您从信号的CV醒来就获得了锁,这是A good Thing 。。

查看Windows(:: createEvent)上的事件,它是没有隐式锁定的简历,很多时候它们会与它们相关联,但没有内置在实际用法中。

尽管这不是创建pthreads中的原始原因条件变量(他们使用锁来保护CV本身,而CV本身不再需要C 中需要的CV本身),其锁的原因和有用性已迁移到此答案中的内容。。