1

我有一种情况,我不得不使用黑盒包装器进行多线程处理(我怀疑它位于 TBB 线程池的顶部)。

我有一个只能由具有昂贵构造函数的对象获得的值,并且每个线程都需要一个本地实例,这没关系。该对象将产生一个值,该值保证跨线程始终相同(所有构造函数从主循环中获取相同的 const 形成参数)。每个线程还可以访问该参数的共享结构并保存一些结果。

线程所需的有问题的值(无符号整数形式的迭代范围)稍后在主循环中使用,所以如果我可以的话,我宁愿不创建上述对象的另一个昂贵的实例来获得相同的再值。

我的问题是,在带有 VC11 的 Windows 和带有 GCC 4.8.2 的 Linux 上,在 x86-64 上,正在将相同的值从多个线程写入相同的内存位置(线程具有指向的结构中的 int),这是一种良性竞争? 这是一场我可以让比赛发生而不用昂贵的锁来保护价值的比赛吗?从粗略的测试来看,情况似乎是这样,但我不完全确定该操作是否在幕后是原子的和安全的,或者是否有可能在压力下出现腐败。

4

1 回答 1

3

数据竞争是否“良性”实际上取决于编译器和运行时平台。编译器假定程序是无竞争的,并且由竞争条件产生的行为是未定义的。使用原子操作不会产生太多开销,建议在这种情况下使用。

可以在此处找到一些边缘案例和非常好的示例,说明可能出现的问题: https ://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-c​​ould-possibly -出错

ThreadSanitizer 开发人员 Dmitry Vyukov 在他的帖子中写道:“因此,如果数据竞争涉及非原子写入,它总是会出错”。

于 2015-02-04T09:25:43.507 回答