如果有多个线程在不同的核心上运行(真正的并行性),并且它们同时访问同一个变量。如果保证只读取变量,那么读取是否会以真正的并行性发生?
考虑以下示例:
如果我们将该变量的访问函数(称为bool stop
)定义为:
bool const & readOnlyAccesToVariable() // Returns a unchangeble reference to the variable
该变量对主线程是私有的。主线程的职责是尽可能同时停止在单独的内核上执行大量 worker 线程。如果stop
更改为1
,工作人员将停止。
工人定期做:
if (readOnlyAccesToVariable() ) break;
一些工人是否会同时停止(意味着停止的读取不是序列化而是并行)?
答案 0 :(得分:2)
只要没有线程会修改该值,读取就完全可以了。
根据定义的不可变变量无法写入,所以是的,这使得它在这方面是安全的。
但是你当然必须确保以线程安全的方式初始化它,并且在初始化之前没有线程会开始读取。
答案 1 :(得分:1)
我不太明白你的问题。
您希望通过将stop变量设置为true来终止大量工作线程。这很好,但请不要忘记使stop停止,因此编译器知道stop的值可以随时更改,并且必须在每次访问它时重新读取它(并且不使用它可能刚刚写入的值寄存器)。
您还说您需要尽可能并行地终止所有线程。首先,我不明白为什么你需要这样做。其次,当你需要所有线程完全同时终止时,我不明白你为什么要做一个轮询机制。为什么不使用事件,设置它并让操作系统唤醒等待事件的所有线程?如果你不能这样做,因为你的线程不仅仅是等待停止事件而且还在做事情,那么我再也不理解你的要求了。如果线程正在做事情并且不时检查停止变量,那么你想如何实现绝对并行终止?这似乎很矛盾。