【发布时间】:2018-05-29 09:18:11
【问题描述】:
我正在开发一个应用程序,目前我只有一个条件变量和许多不同条件的等待语句。每当其中一个队列或其他状态发生更改时,我只需调用 cv.notify_all(); 并知道所有等待此状态更改的线程都会收到通知(可能还有其他正在等待不同条件的线程)。
我想知道为每个队列或状态使用单独的条件变量是否有意义。我所有的队列通常都是独立的,因此等待队列x 中的数据的线程并不关心队列y 中的新数据。所以我不会遇到必须通知或等待多个条件变量的情况(这是我发现的大多数问题)。
从性能的角度来看,周围有几十个条件变量有什么缺点吗?当然,代码可能更容易出错,因为必须通知正确的条件变量。
编辑:所有条件变量仍将使用相同的互斥锁。
【问题讨论】:
-
拥有多个条件变量的问题是如果/当您需要等待多个条件变量时,没有好的方法可以做到,如果您不需要等待多个条件变量它最好有多个,因为这样会减少无用的通知
-
@MikhailVasilyev 所有条件变量都将使用相同的互斥锁,所以我相信我的问题与链接的问题不同。
-
如果您只想通知某些线程是有意义的,只有与特定特定 cv 关联的线程才会被通知。
-
我使用单个条件变量来处理多次等待,结果非常可接受。我使用 atomic int 作为“地址”来识别等待和通知。只有“地址”与通知地址匹配的等待才会响应通知。我把所有繁琐的东西都包在了一个类中,用法基本是 foo.wait(my_address); 和 foo.notify(some_address);许多不同的线程可能正在等待,我什至处理了多个线程在同一个地址上等待的情况,这是我的应用程序中的常见情况。
标签: c++ multithreading condition-variable