multithreading - C++11:所有线程必须等待每个线程完成第 1 步,然后才能开始第 2 步
问题描述
我启动了许多子线程,它们都完成了他们的第一个任务。我希望他们都等待,然后再继续他们的第二项任务。
我的想法是一些代码,例如:
some_lock_type lock;
atomic<int> iThreadsDoneStep1;
void Thread() {
// Step 1.
:
:
// Now wait for the rest to finish step 1, or if I am the last to finish, wake up the others.
if ( ++iThreadsDoneStep1 == iThreadCount )
lock.notify_all();
else
lock.wait();
// Step 2.
:
:
}
当然,事实证明条件变量不是那样工作的。我试图弄清楚它们是否对这个问题有用,或者我是否需要期货,或者什么。
我最好的主意是使用 C++17 shared_mutex。主线程将获得排他锁lock()
,notify_all()
在上面的示例中实际上是unlock()
whilewait()
将是lock_shared()
。一旦独占锁被释放,所有非独占锁寻求者都会成功并继续。然而,它似乎与锁类的精神完全不同,我不想超过 C++11。
解决方案
推荐阅读
- asp.net - HTTP 错误 404.17 - 未找到 - .NET - IIS 10
- java - [android]如何使用 'ernestoyaquello' 发布的垂直步进器 github 代码
- python - 更改矩形的 X 值实际上不会在 GUI 中移动它
- bash - 通过本地 bash 脚本在 ssh 服务器中导航
- sql - AWS Athena Table 每一列的行数
- javascript - 单击引导选择选择器的下拉菜单时关注搜索框输入
- go - 与 reflect.StructTag.Get 不兼容
- flutter - 无法在颤动的谷歌地图上设置我的位置
- angular - 如何根据服务的值更改 module.ts 中的路由?
- java - 构建/编译颤振应用程序时出现问题