是否可以在C ++中关闭线程安全性?

时间:2019-07-26 02:54:03

标签: c++ c++11 g++ thread-safety clang++

我正在构建IO密集型分布式系统,并且我计划使进程无状态,以便提供单个线程但可扩展的运行时。我使用libuv在C语言中启动了该项目,并且效果很好,并且效果很好。但是,由于C需要大量样板代码,因此开发需要花费大量时间。

因此,我正在评估C ++作为替代方案,但是,我还没有找到选择退出诸如std::shared_ptr之类的线程安全结构的任何方法。在clanggcc中,是否有任何方法可以禁止对标准库结构的原子访问,以使单线程进程没有互斥/原子开销?

3 个答案:

答案 0 :(得分:2)

标准库线程安全性:Libstdc ++

正如Florian所说,libstdc ++的引用计数的线程安全性取决于程序是否链接到libpthread,以便单线程程序(或更具体地说,未链接到libpthread的程序)自动禁用线程安全性。 。 Libstdc ++在shared_ptr,旧的写时复制std::stringstd::locale初始化中使用引用计数。有几种方法可以强制其不使用非线程安全的引用计数:

  • 避免任何libpthread依赖性,以便libstdc ++代码将自动使用单线程模式。
  • 使用--disable-thread=single重建GCC,以便即使程序链接到libpthread,重建的libstdc ++默认情况下也使用单线程模式。
  • 使用libstdc ++的shared_ptr实现的非标准属性来强制进行非原子引用计数,即使GCC并非以单线程模式构建且程序已链接到libpthread,请参见https://stackoverflow.com/a/15141844/981959怎么做。这不会影响语言环境和COW字符串中引用计数的其他用途。

标准库线程安全:Libc ++

对于libc ++,我认为您需要重建库,并将-DLIBCXX_ENABLE_THREADS=OFF选项传递给CMake。这将全局禁用所有线程安全性。使用该库时,您无法更改该属性,该属性在构建libc ++时已修复。

核心语言线程安全性:GCC和Clang

您可以使用-fno-threadsafe-statics选项来禁用局部静态变量的线程安全初始化。除非使用该选项,否则将自动添加用于使本地静态线程安全初始化的代码,并且该代码与程序是否链接到libpthread无关。

答案 1 :(得分:1)

如果该流程未与libstdc++链接,则std::shared_ptr的{​​{1}}实现会自动禁用原子指令。您可以使用libpthread进行检查。

ldd的典型构建是与libuv链接的,因此,您将需要一个不这样做的库构建(如果可能的话)。

答案 2 :(得分:0)

一种方法可能是采用c ++ 11之前的标准,其中stl和语言明显不是线程安全的。

或者,如果提供的shared_ptr冒犯了您那么多,请不要使用它。 “旧” stl的其余大部分都不依赖于它,也没有提供任何线程安全性。您显然不想看std :: async和朋友。

关于线程内行为的唯一其他发现是静态函数变量(即单例)和内存管理器(malloc),尽管很难避免。