从多个线程读取数据的正确性

Correctness of reading data from multiple threads

本文关键字:数据 正确性 读取 线程      更新时间:2023-10-16

我在主线程中创建了一个全局变量(C++),并将其值设置为X,然后设置为Y。之后,我生成多个线程并从这个变量中读取。我能保证我会读Y吗?

如果没有,读(共享)互斥锁保护会解决这个问题吗?(即使互斥总是可以被占用)

究竟是什么迫使多个处理器的缓存同步?

启动线程会引入一个隐式内存屏障。

C++11保证在§30.3.1.2:中构造std::threads

同步:完成对构造函数的调用与f的副本的调用开始同步。

其中f是线程正在执行的函数。另请参阅§1.10,了解同步的定义(或查看此博客文章)。

用外行的话来说,同时从不同线程读取值是安全的,并且可以保证它们都会读取最新的、正确的值。当然,只有当您开始启动线程后,没有人对该变量执行任何写入时,这才是正确的。在这种情况下,您将需要原子锁或显式锁(即互斥锁)。

如果在将Y分配给变量后生成线程,它们确实会看到该值。

读(共享)互斥锁保护能解决这个问题吗?

只有当您同时修改变量时(无论其他并发操作是读还是写),才需要互斥。如果您从不同时修改变量(就像这里的情况一样),那么就不需要互斥。

究竟是什么迫使多个处理器的缓存同步?

通常,对内存位置的写入会使其他处理器上的相应缓存条目无效。当您再次访问该变量时,如果需要,相应的处理器将重新填充缓存。