Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux上boost多线程库的正确链接_Linux_Multithreading_Boost - Fatal编程技术网

Linux上boost多线程库的正确链接

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版本 我读过这本书 但是我不清楚什么“表示库是在启

我对是否链接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来识别”

  • 如果链接到-lboost\u thread-mt,是否需要切换到其他库的多线程版本?如果没有,我什么时候需要链接到-mt变体

  • 只有在需要时才有针对-mt变体的选择性链接的建议吗?该项目使用GNU Make进行构建

  • 始终针对-mt变体进行链接是否会对性能或功能造成影响

  • 当您在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

    当您在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

    谢谢。这大概是我所期望的,但不完全是我想听的。谢谢。这大概是我所期望的,但并不完全是我想听到的。