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

时间:2015-05-12 14:52:26

标签: c++ multithreading c++11 concurrency flags

条件变量是c ++ 11的一个方面我还在苦苦挣扎。从我收集到的条件变量非常类似于信号量。

但话又说回来,信号量不需要锁定才能运行。条件变量可以。而锁又需要一个互斥锁。因此,为了使用信号量的相当简单的功能,我们现在不仅需要管理条件变量。但也是一个互斥锁和锁。

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

2 个答案:

答案 0 :(得分:6)

条件变量通常用于表示状态的变化。通常需要互斥锁来进行更改,以及以下信号,原子。

信号量封装了一些状态(标志或计数器)以及信令机制。条件变量更原始,只提供信号。

答案 1 :(得分:4)

一般情况下,一旦您发现某些内容发生了变化(通过条件变量),您需要运行一些代码来处理该更改,并且该代码必须安全地读取更改的数据。如果您没有与cv关联的锁,则等待cv的线程可能会唤醒,然后尝试(并且失败)获取与数据关联的锁,因此必须再次产生。使用CV / Lock组合,只有当线程可以将相关锁作为一个单元获取时,底层系统才能唤醒您的线程,从而提高效率。

它本身不太可能是一个有用的简历是有用的,因为它没有提供超过它发出信号的数据。如果您想象使用cv - 例如与生产者和消费者的线程安全链表,则您有表示def index @total_movies = Movie.count @moviecheckout = MovieCheckout.find_by movie_id: movie.id end 的变量。在这种情况下,你拿锁,改变列表,释放锁然后发信号通知cv。在您的消费者线程中,您很可能需要在发出信号后对该列表执行锁定,因此一旦您从发出信号的CV中醒来获取锁定就是好事

看看类似于Windows(:: CreateEvent)上的事件,这些事件是没有隐式锁定的cv,很多时候他们都有与之关联的锁,但是没有内置到实际使用情况。

虽然这并不是pthreads中创建原始条件变量的原因(它们使用了锁来保护cv本身,这在c ++中不再需要),但cv&s的锁的原因和用处有在这个答案中迁移到了什么。

相关问题