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

时间:2013-08-27 13:30:57

标签: c++ multithreading

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

如果没有,会读(共享)-mutex保护解决吗? (即使可以随时使用互斥锁)

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

2 个答案:

答案 0 :(得分:4)

启动线程会引入隐式内存障碍。

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

  

同步:完成构造函数的调用   与f。

副本的调用开始同步

其中f是线程正在执行的函数。有关同步的定义,请参阅§1.10(或查看this blog post)。

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

答案 1 :(得分:0)

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

  

会读(共享)-mutex保护解决它吗?

只有在您同时修改变量时才需要互斥锁(无论其他并发操作是读还是写)。如果您从不同时修改变量(如此处所示),则不需要互斥锁。

  

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

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