我正在构建IO密集型分布式系统,并且我计划使进程无状态,以便提供单个线程但可扩展的运行时。我使用libuv在C语言中启动了该项目,并且效果很好,并且效果很好。但是,由于C需要大量样板代码,因此开发需要花费大量时间。
因此,我正在评估C ++作为替代方案,但是,我还没有找到选择退出诸如std::shared_ptr
之类的线程安全结构的任何方法。在clang
或gcc
中,是否有任何方法可以禁止对标准库结构的原子访问,以使单线程进程没有互斥/原子开销?
答案 0 :(得分:2)
正如Florian所说,libstdc ++的引用计数的线程安全性取决于程序是否链接到libpthread,以便单线程程序(或更具体地说,未链接到libpthread的程序)自动禁用线程安全性。 。 Libstdc ++在shared_ptr
,旧的写时复制std::string
和std::locale
初始化中使用引用计数。有几种方法可以强制其不使用非线程安全的引用计数:
--disable-thread=single
重建GCC,以便即使程序链接到libpthread,重建的libstdc ++默认情况下也使用单线程模式。shared_ptr
实现的非标准属性来强制进行非原子引用计数,即使GCC并非以单线程模式构建且程序已链接到libpthread,请参见https://stackoverflow.com/a/15141844/981959怎么做。这不会影响语言环境和COW字符串中引用计数的其他用途。对于libc ++,我认为您需要重建库,并将-DLIBCXX_ENABLE_THREADS=OFF
选项传递给CMake。这将全局禁用所有线程安全性。使用该库时,您无法更改该属性,该属性在构建libc ++时已修复。
您可以使用-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),尽管很难避免。