首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++线程:先来互斥

C++线程:先来互斥
EN

Stack Overflow用户
提问于 2016-07-18 19:54:34
回答 4查看 385关注 0票数 0

我试图解决以下架构,但有一些麻烦。

基本上,有多个线程并行地访问同一个对象。第一个线程意味着执行Object.A(),所有其他线程都应该等待该进程完成,然后继续同时执行Object.B(),而不需要任何阻塞。

在网上找不到任何可以解释这种功能的资源,而任何使用2个自定义布尔互斥的“解决方案”似乎都不起作用。

EN

Stack Overflow用户

回答已采纳

发布于 2016-07-18 20:09:36

NathanOliver在注释中建议的方法,即在主线程上调用A(),然后旋转其他线程,这是最简单的方法,也是您应该考虑的第一个方法。

但是您要寻找的构造称为“监视器”(https://en.wikipedia.org/wiki/Monitor_(synchronization%29))(您缺少的部分称为“条件变量”,“监视器”指的是您需要的整个互斥+ cond对)。

我不会在这里重现例子,因为很容易找到信息(Travis Gockel刚刚发布了一个很好的例子)。取决于您的线程子系统:

  • 有关线程,请参见条件变量
  • 对于Windows来说,条件变量事件对象都可以用来完成类似的事情,当适用于基本的布尔条件变量时,我更喜欢后者,但是如果有多个线程在等待并且想要唤醒它们,那么重置事件可能会变得很棘手。

一次运行的一般模式是:

  • 第一个线程:
    • 调用A()
    • 当返回时,向一些"AFinished“cond发出信号。

  • 其他线程:
    • 等等"AFinished“。
    • 调用B()

如果要重复该进程,则必须在所有B()运行后重置条件,并在再次调用A()之前等待该状态。您可以使用另一个cond var来完成这个任务,您可以使用信号量和一些注意事项来完成它,等等。

我知道这是简短的,但希望它至少给你一些关键字的搜索。

有益的补充阅读:

或者,查看具有任务队列的线程池。您可以将运行A()的任务排队,然后在任务完成时排队(或者让这些B()任务维护共享的信号量,或者只是一个基本的线程安全计数器- InterlockedDecrement )。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38444969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档