从多个线程读取数据的正确性
Correctness of reading data from multiple threads
我在主线程中创建了一个全局变量(C++),并将其值设置为X,然后设置为Y。之后,我生成多个线程并从这个变量中读取。我能保证我会读Y吗?
如果没有,读(共享)互斥锁保护会解决这个问题吗?(即使互斥总是可以被占用)
究竟是什么迫使多个处理器的缓存同步?
启动线程会引入一个隐式内存屏障。
C++11保证在§30.3.1.2:中构造std::threads
同步:完成对构造函数的调用与f的副本的调用开始同步。
其中f是线程正在执行的函数。另请参阅§1.10,了解与同步的定义(或查看此博客文章)。
用外行的话来说,同时从不同线程读取值是安全的,并且可以保证它们都会读取最新的、正确的值。当然,只有当您开始启动线程后,没有人对该变量执行任何写入时,这才是正确的。在这种情况下,您将需要原子锁或显式锁(即互斥锁)。
如果在将Y
分配给变量后生成线程,它们确实会看到该值。
读(共享)互斥锁保护能解决这个问题吗?
只有当您同时修改变量时(无论其他并发操作是读还是写),才需要互斥。如果您从不同时修改变量(就像这里的情况一样),那么就不需要互斥。
究竟是什么迫使多个处理器的缓存同步?
通常,对内存位置的写入会使其他处理器上的相应缓存条目无效。当您再次访问该变量时,如果需要,相应的处理器将重新填充缓存。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 代理对象的常量正确性
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 如何强制实施有关指针数据成员的常量正确性
- 由非const类处理的数据的const正确性
- 从多个线程读取数据的正确性