Linux上boost多线程库的正确链接
我对是否链接libboot_*-mt变体以及它们的实际用途感到有点困惑 我正在Centos 6上使用boost 1.46.0的自定义后端口。该构建生成了/usr/lib64/libboost_thread-mt.so.7以及其他库的-mt和标准版本 我已经编写了一个单元测试程序,它使用一个线程在boost::future中存储一个计算。为了链接该测试,我必须添加-lboost_thread-mt。但是我不需要更改其他boost-l参数来使用-mt版本 我读过这本书 但是我不清楚什么“表示库是在启用多线程支持的情况下构建的。在没有多线程支持的情况下构建的库可以通过缺少-mt来识别”Linux上boost多线程库的正确链接,linux,multithreading,boost,Linux,Multithreading,Boost,我对是否链接libboot_*-mt变体以及它们的实际用途感到有点困惑 我正在Centos 6上使用boost 1.46.0的自定义后端口。该构建生成了/usr/lib64/libboost_thread-mt.so.7以及其他库的-mt和标准版本 我已经编写了一个单元测试程序,它使用一个线程在boost::future中存储一个计算。为了链接该测试,我必须添加-lboost_thread-mt。但是我不需要更改其他boost-l参数来使用-mt版本 我读过这本书 但是我不清楚什么“表示库是在启
threading=multi
时,将生成“mt”变量。“mt”选项的后果之一是定义了BOOST\u线程
当然,您链接的所有boost lib都应该是相同的变体,这与应用程序的线程匹配。否则,您可能会导致ODR冲突:假设在库A中编译shared\u ptr
,而库B中没有BOOST\u线程
,而库B中有BOOST\u线程
。这两个共享的\u ptr
具有完全不同的spinlock类实现。因此,如果您从库A获取共享的\u ptr
,并将其传递给库B,那么您的程序将崩溃。此外,mt和非mt变体可能使用不同的堆
(也就是说,值得一提的是,BOOST_的线程依赖于其他一些宏,甚至可以在非mt变体中定义,因此将mt与非mt混合偶尔可以工作——但不要依赖于此。)
至于性能损失-显然,mt变体可能会稍微慢一点
更新:我关于BOOST\u的假设有线程
。不过,混合使用mt/非mt变体是个坏主意,因为threading=multi
会影响Boost ABI 当您在bjam行中设置threading=multi
时,将生成“mt”变体。“mt”选项的后果之一是定义了BOOST\u线程
当然,您链接的所有boost lib都应该是相同的变体,这与应用程序的线程匹配。否则,您可能会导致ODR冲突:假设在库A中编译shared\u ptr
,而库B中没有BOOST\u线程
,而库B中有BOOST\u线程
。这两个共享的\u ptr
具有完全不同的spinlock类实现。因此,如果您从库A获取共享的\u ptr
,并将其传递给库B,那么您的程序将崩溃。此外,mt和非mt变体可能使用不同的堆
(也就是说,值得一提的是,BOOST_的线程依赖于其他一些宏,甚至可以在非mt变体中定义,因此将mt与非mt混合偶尔可以工作——但不要依赖于此。)
至于性能损失-显然,mt变体可能会稍微慢一点
更新:我关于BOOST\u的假设有线程
。不过,混合使用mt/非mt变体是个坏主意,因为threading=multi
会影响Boost ABI 谢谢。这大概是我所期望的,但不完全是我想听的。谢谢。这大概是我所期望的,但并不完全是我想听到的。