不久,我将开始研究使用共享内存的网格细化算法的并行版本。
这所大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不知道线程。
我搜索了这个问题,答案取决于编译器(有些尝试稍微了解线程)和平台(如果编译器使用的系统调用是线程安全的还是不安全的)。
那么,在linux中,gcc 4编译器会为新操作符生成线程安全代码吗?
如果没有,克服这个问题的最好办法是什么?或者把每个电话都锁定到新接线员那里?
发布于 2009-04-30 00:43:57
您必须非常努力地寻找一个支持线程但没有线程安全new的平台。事实上,new (和malloc)的线程安全是它如此缓慢的原因之一。
另一方面,如果您想要一个线程安全的STL,您可以考虑英特尔TBB,它具有线程感知容器(尽管并不是对它们的所有操作都是线程安全的)。
发布于 2009-04-28 03:26:26
通常,new操作符是线程安全的--但是对STL调用的线程安全保证和标准库受标准的控制--这并不意味着它们是线程不知道的--它们往往对某些操作的线程安全有非常好的定义保证。例如,以只读方式迭代列表对于多个读者来说是线程安全的,而迭代列表和进行更新则不是安全的。您必须阅读这些文档,看看各种保证是什么,尽管它们并不繁重,而且往往是有意义的。
发布于 2009-04-28 04:15:10
虽然我说的是我没有使用的概念,但我觉得我应该提到,如果您使用的是共享内存,那么您很可能希望确保只使用POD类型,并使用新位置。
其次,如果您使用共享内存(通常理解为linux系统上的共享内存),那么您可能使用多个进程--而不是线程--分配内存和“做事情”--使用共享内存作为通信层。如果是这样的话,那么应用程序和库的线程安全并不重要-但是,重要的是使用共享内存分配的任何东西的线程安全!这与使用多个线程运行一个进程不同,在这种情况下,询问新操作符的线程安全性是一个有效的问题,如果不是,可以通过放置new或定义自己的分配器来解决。
https://stackoverflow.com/questions/796099
复制相似问题