我试图解决以下架构,但有一些麻烦。
基本上,有多个线程并行地访问同一个对象。第一个线程意味着执行Object.A(),所有其他线程都应该等待该进程完成,然后继续同时执行Object.B(),而不需要任何阻塞。
在网上找不到任何可以解释这种功能的资源,而任何使用2个自定义布尔互斥的“解决方案”似乎都不起作用。
发布于 2016-07-18 20:09:36
NathanOliver在注释中建议的方法,即在主线程上调用A(),然后旋转其他线程,这是最简单的方法,也是您应该考虑的第一个方法。
但是您要寻找的构造称为“监视器”(https://en.wikipedia.org/wiki/Monitor_(synchronization%29))(您缺少的部分称为“条件变量”,“监视器”指的是您需要的整个互斥+ cond对)。
我不会在这里重现例子,因为很容易找到信息(Travis Gockel刚刚发布了一个很好的例子)。取决于您的线程子系统:
一次运行的一般模式是:
A()
B()
如果要重复该进程,则必须在所有B()运行后重置条件,并在再次调用A()之前等待该状态。您可以使用另一个cond var来完成这个任务,您可以使用信号量和一些注意事项来完成它,等等。
我知道这是简短的,但希望它至少给你一些关键字的搜索。
有益的补充阅读:
或者,查看具有任务队列的线程池。您可以将运行A()的任务排队,然后在任务完成时排队(或者让这些B()任务维护共享的信号量,或者只是一个基本的线程安全计数器- InterlockedDecrement )。
发布于 2016-07-18 20:41:41
我不讨论实现细节,但在方法方面,您要寻找的是来自信号灯的小书的屏障解决方案。

屏障问题是使所有线程在集合的点上相遇,然后所有线程都继续执行关键部分(在您的示例中是Object.B())。在集合点开会之前,只有第一个线程执行Object.A()并在集合时加入线程。查看同一本书中的Reader编写器问题,了解如何使第一个线程执行/调用Object.A()
发布于 2016-07-18 20:09:22
如果需要并行方式,可以使用条件变量为Object.B()启动线程。但是Object.B()必须是线程安全的。
https://stackoverflow.com/questions/38444969
复制相似问题