Linux和gcc 4中的C++ new运算符线程安全性

Gas*_*ton 14 c++ linux gcc thread-safety

不久,我将开始使用共享内存开发并行版本的网格细化算法.

该大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不是线程感知的.

我搜索了这个问题,答案取决于编译器(有些尝试有点线程感知)和平台(如果编译器使用的系统调用是否是线程安全的).

那么,在linux中,gcc 4编译器为new运算符生成线程安全的代码?

如果没有,解决这个问题的最佳方法是什么?也许锁定每个呼叫到新的运营商?

Max*_*ert 18

您必须非常努力地找到支持线程但没有线程安全的平台new.事实上,new(和malloc)的线程安全性是它如此缓慢的原因之一.

如果你想要一个线程安全的STL,你可以考虑具有线程感知容器的英特尔TBB(尽管并非它们上的所有操作都是线程安全的).


180*_*ION 8

通常,new运算符是线程安全的 - 但是对于调用STL和标准库的线程安全保证是由标准控制的 - 这并不意味着它们是线程不知道的 - 它们往往具有非常明确的线程安全保证操作.例如,以只读方式遍历列表对于多个读者来说是线程安全的,而迭代列表并进行更新则不是.你必须阅读文档,看看各种保证是什么,虽然它们并不繁琐,但它们往往有意义.

  • 这取决于您的编译器提供程序或实现 - 例如,在 Visual C++ 中,您可以在多线程标准库或单线程库之间进行选择,尽管现在这并不是什么选择,因为几乎所有感兴趣的事情都需要使用多线程库。 (2认同)