我在主线程中创建了一个全局变量 (C++),并将其值设置为 X,然后设置为 Y。之后,我生成了多个线程并从该变量中读取。我能保证我会读 Y 吗?
如果没有,read(shared)-mutex protection 会解决它吗?(即使总是可以使用互斥锁)
究竟是什么迫使多个处理器的缓存同步?
我在主线程中创建了一个全局变量 (C++),并将其值设置为 X,然后设置为 Y。之后,我生成了多个线程并从该变量中读取。我能保证我会读 Y 吗?
如果没有,read(shared)-mutex protection 会解决它吗?(即使总是可以使用互斥锁)
究竟是什么迫使多个处理器的缓存同步?
启动线程会引入隐式内存屏障。
C++11 保证std::threads
在 §30.3.1.2 中进行构造:
同步:构造函数调用的完成与 f 的副本调用的开始同步。
其中 f 是线程正在执行的函数。另请参阅 §1.10 以了解synchronizes with的定义(或查看此博客文章)。
通俗地说,从不同线程同时读取值是安全的,并且保证它们都将读取最新的正确值。这当然只有在您开始启动线程后没有人对该变量执行任何写入的情况下才是正确的。在这种情况下,您将需要原子锁或显式锁(即互斥锁)。
如果您在分配给变量后Y
生成线程,它们确实会看到该值。
read(shared)-mutex protection 会解决它吗?
仅当您同时修改变量时才需要互斥锁(无论其他并发操作是读取还是写入)。如果你从不同时修改你的变量(就像这里的情况),你不需要互斥锁。
究竟是什么迫使多个处理器的缓存同步?
通常,对内存位置的写入将使其他处理器上的相应缓存条目无效。当您再次访问该变量时,如果需要,相应的处理器将重新填充缓存。