我有一种情况,我不得不使用黑盒子包装器进行多线程处理(我怀疑它位于TBB线程池之上)。
我有一个只能由具有昂贵构造函数的对象获取的值,并且每个线程都需要一个本地实例,这是正常的。 该对象将产生一个保证在线程之间始终相同的值(所有构造函数从主循环中获取相同的const形成参数)。 每个线程还可以访问该参数的共享结构,并保存一些结果。
线程所需的有问题的值(以unsigned int形式的迭代范围)稍后在主循环中使用,所以如果我可以,我宁愿不创建上述对象的另一个昂贵的实例再次获得相同的价值。
我的问题是,在带有VC11的Windows和带有GCC 4.8.2的Linux上,在x86-64上,是从多个线程向相同的内存位置(线程中有一个指向的结构中的int)写入相同的值一场良性的比赛?这是一场比赛我能不能用昂贵的锁来保护价值吗?从粗略的测试来看似乎是这样,但我不完全确定这种操作是否具有原子性和安全性,或者是否存在可能在压力下出现腐败的可能性。
答案 0 :(得分:3)
如果数据竞赛是"良性"或者不是真的取决于编译器和运行时平台。编译器假设程序是无竞争的,并且由竞争条件导致的行为是不确定的。使用原子操作不会产生太多开销,建议在这种情况下使用。
可以在这里找到一些边缘情况以及可能出现问题的非常好的例子: https://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-could-possibly-go-wrong
在他的帖子中,ThreadSanitizer开发人员Dmitry Vyukov写道,#34;所以,如果数据竞争涉及非原子写入,那么它总是会出错#34;。