多个线程竞相将相同的数据设置为相同的值
Several Threads racing to set the same data to the same value
我遇到一种情况,我不得不使用黑盒包装器进行多线程处理(我怀疑它位于TBB线程池之上)。
我有一个值,只能由具有昂贵构造函数的对象获取,并且每个线程都需要该值的本地实例,这没关系。该对象将生成一个值,该值保证在线程之间始终相同(所有构造函数都从主循环中获取相同的 const 形成参数)。每个线程还可以访问该参数的共享结构以及保存一些结果。
线程所需的相关值(无符号 int 形式的迭代范围)稍后将在主循环中使用,所以如果可以的话,我宁愿不创建上述对象的另一个昂贵的实例只是为了再次获得相同的值。
我的问题是,在带有 VC11 的 Windows 和带有 GCC 4.8.2 的 Linux 上,在 x86-64 上,将相同的值写入相同的内存位置(线程具有指针指向的结构中的 int)是否是良性竞赛?这是一场我可以放任自流的比赛,而不用昂贵的锁来保护价值吗?从粗略的测试来看,情况似乎是这样,但我不完全确定幕后的操作是否是原子和安全的,或者是否存在可能在压力下出现的腐败的可能性。
数据竞争是否"良性"实际上取决于编译器和运行时平台。编译器假定程序是无种族的,并且由竞争条件导致的行为是未定义的。使用原子操作不会产生太多开销,在这种情况下建议使用。
可以在此处找到一些边缘案例和可能出错的很好的例子:https://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-could-possibly-go-wrong
在他的帖子中,ThreadSanitizer开发人员Dmitry Vyukov写道:"所以,如果数据竞赛涉及非原子写入,它总是会出错"。
- 嵌套在类中时无法设置成员数据
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 在 lldb 中为大型数据结构设置观察点
- 如何在引用上设置数据断点
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 在C++中设置仅包含每个类的一个外观的数据结构
- 在 C++ 中设置的用户定义数据类型
- 在主函数中设置私有数据
- GLSL 计算着色器 使用查找表设置缓冲区会导致不写入任何数据,与其他数据设置相同的缓冲区有效
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 将 std::map 项设置为 CListBox 的项数据
- 如何在NS3中设置节点的IP地址和数据?
- 设置一系列基/派生类来处理天气数据
- 我如何调用我的3个数据成员中每个人的设置方法,然后显示由我的设置方法设置的值
- 根据参数设置构造函数的成员数据类型
- C++应用程序中的持久数据/设置
- 多个线程竞相将相同的数据设置为相同的值
- 我的mmap代码中的设置将所有文件数据设置为零
- 如何使用C++在RAD Studio XE6中存储Android应用程序数据/设置