多个线程竞相将相同的数据设置为相同的值

Several Threads racing to set the same data to the same value

本文关键字:数据 设置 线程      更新时间:2023-10-16

我遇到一种情况,我不得不使用黑盒包装器进行多线程处理(我怀疑它位于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写道:"所以,如果数据竞赛涉及非原子写入,它总是会出错"。