可以读取真正的并行性吗?

时间:2013-10-30 08:24:53

标签: multithreading

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

考虑以下示例:

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

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

该变量对线程是私有的。主线程的职责是尽可能同时停止在单独的内核上执行大量 worker 线程。如果stop更改为1工作人员将停止。

工人定期做:

if (readOnlyAccesToVariable() ) break;

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

2 个答案:

答案 0 :(得分:2)

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

根据定义的不可变变量无法写入,所以是的,这使得它在这方面是安全的。

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

答案 1 :(得分:1)

我不太明白你的问题。

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

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