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

标签 c++ multithreading thread-safety gcc4.8 visual-studio-2012

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

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

线程所需的相关值(unsigned int 形式的迭代范围)稍后在主循环中使用,因此如果可以的话,我宁愿不创建上述对象的另一个昂贵实例只是为了再次获得相同的值。

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

最佳答案

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

一些边缘案例和关于可能出错的很好的例子可以在这里找到: https://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-could-possibly-go-wrong

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

关于c++ - 多个线程竞相将相同的数据设置为相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28316635/

相关文章:

c++ - 如何检查/检测不带花括号的 'if' 子句?

c++ - 重载运算符的返回值分段失败

multithreading - 在 grails 中创建临时队列,创建大量临时队列

java - 多线程环境中的对象深度锁定

Javascript 线程处理和竞争条件

c++ - 模板 typedef 不是类或命名空间名称

c++ - 是否允许在一个类中混合使用新旧 C++ 函数语法?

java - 如何知道哪个线程受 notify() 或 notifyAll() 影响 - Java

c++ - 这个有互锁吗? C++

multithreading - 当主线程被阻塞时显示事件指示器(继续)