0

如果有多个线程在不同的内核上运行(真正的并行性)并且它们同时访问同一个变量。如果保证他们只读取变量,读取可以真正并行发生吗?

考虑以下示例:

如果我们将对该变量(称为bool stop)的访问函数定义为:

bool const & readOnlyAccesToVariable()  // Returns a unchangeble reference to the variable 

该变量是线程私有的。主线程的职责是尽可能同时停止在不同内核上执行大量工作线程。如果更改为 ,则停止工作人员stop1

工人定期做:

if (readOnlyAccesToVariable() ) break;

一些工人会同时停止(意味着停止的读取不是串行的而是并行的)?

4

2 回答 2

2

只要没有线程会修改该值,读取就完全可以。

根据定义,一个不可变的变量不能被写入,所以是的,这使得它在这方面是线程安全的。

但是,您当然必须确保它以线程安全的方式进行初始化,并且在初始化之前没有线程将开始读取。

于 2013-10-30T08:26:25.950 回答
1

我不太明白你的问题。

您想通过将停止变量设置为 true 来终止大量工作线程。这很好,但请不要忘记使 stop volatile 以便编译器知道 stop 的值可以随时更改,并且每次必须访问它时都必须重新读取 stop (而不是使用它可能刚刚写入的值登记)。

您还说您需要尽可能并行地终止所有线程。首先,我不明白你为什么需要这样做。其次,当您需要所有线程完全相同地终止时,我不明白为什么要执行轮询机制。你为什么不使用一个事件,设置它并让操作系统唤醒所有等待事件的线程?如果您不能这样做,因为您的线程不仅在等待停止事件而且还在做事,那么我再次不理解您的要求。如果线程在做事并且时不时检查stop变量,那么你想如何实现绝对并行终止呢?这似乎很矛盾。

于 2013-10-30T09:14:41.567 回答