为什么条件变量需要锁(因此也需要互斥锁)
Why does a condition variable need a lock (and therefore also a mutex)
条件变量是 c++11 的一个方面,我仍在苦苦挣扎。从我收集到的情况来看,条件变量与信号量非常相似。
但话又说回来,信号量不需要锁来运行。条件变量可以。而锁又需要互斥体。因此,为了使用信号量的相当简单的功能,我们现在不仅需要管理一个条件变量。还有一个互斥体和一个锁。
那么为什么条件变量需要这个?添加此要求提供了哪些附加功能?
条件变量通常用于表示状态变化。通常需要互斥锁来进行更改,以及以下信号,atomic。
信号量封装了一些状态(标志或计数器)以及信号机制。条件变量更原始,只提供信号。
一般来说,一旦您发出信号(通过条件变量)发生了变化,您就需要一些代码来 运行 处理该变化,并且该代码必须安全地读取变化的数据。如果您没有与 cv 关联的锁,那么等待 cv 的线程可能会唤醒,然后尝试(并失败)获取与数据关联的锁,因此必须再次让步。使用 CV/Lock 组合,只有当线程可以作为一个单元获取相关锁时,底层系统才能唤醒您的线程,因此效率更高。
CV 本身不太可能有用,因为它没有提供超出信号通知事实的任何数据。如果您想象 cv 的用途——例如包含生产者和消费者的线程安全链表,您就有代表 {list, cv, lock}
的变量。在这种情况下,您获取锁,改变列表,释放锁然后向 cv 发出信号。在您的消费者线程上,您很可能需要在发出信号后获取锁以对列表进行操作,因此一旦您从发出信号的 CV 中醒来就获得锁是一件 好事 .
看看类似 windows (::CreateEvent) 上的事件,它们是没有隐式锁的 cv,很多时候它们会有一个与之关联的锁,但只是没有内置到实际使用。
虽然这不是在 pthreads 中创建条件变量的最初原因(他们使用锁来保护 cv 本身,这在 c++ 中不再需要),但 cv 锁的原因和用途已经迁移到 whats in这个答案。
条件变量是 c++11 的一个方面,我仍在苦苦挣扎。从我收集到的情况来看,条件变量与信号量非常相似。
但话又说回来,信号量不需要锁来运行。条件变量可以。而锁又需要互斥体。因此,为了使用信号量的相当简单的功能,我们现在不仅需要管理一个条件变量。还有一个互斥体和一个锁。
那么为什么条件变量需要这个?添加此要求提供了哪些附加功能?
条件变量通常用于表示状态变化。通常需要互斥锁来进行更改,以及以下信号,atomic。
信号量封装了一些状态(标志或计数器)以及信号机制。条件变量更原始,只提供信号。
一般来说,一旦您发出信号(通过条件变量)发生了变化,您就需要一些代码来 运行 处理该变化,并且该代码必须安全地读取变化的数据。如果您没有与 cv 关联的锁,那么等待 cv 的线程可能会唤醒,然后尝试(并失败)获取与数据关联的锁,因此必须再次让步。使用 CV/Lock 组合,只有当线程可以作为一个单元获取相关锁时,底层系统才能唤醒您的线程,因此效率更高。
CV 本身不太可能有用,因为它没有提供超出信号通知事实的任何数据。如果您想象 cv 的用途——例如包含生产者和消费者的线程安全链表,您就有代表 {list, cv, lock}
的变量。在这种情况下,您获取锁,改变列表,释放锁然后向 cv 发出信号。在您的消费者线程上,您很可能需要在发出信号后获取锁以对列表进行操作,因此一旦您从发出信号的 CV 中醒来就获得锁是一件 好事 .
看看类似 windows (::CreateEvent) 上的事件,它们是没有隐式锁的 cv,很多时候它们会有一个与之关联的锁,但只是没有内置到实际使用。
虽然这不是在 pthreads 中创建条件变量的最初原因(他们使用锁来保护 cv 本身,这在 c++ 中不再需要),但 cv 锁的原因和用途已经迁移到 whats in这个答案。