有可能在所谓的线程感知模式下编译BOOST库。如果是这样,您将看到库名称中出现“...- mt ...”。我无法理解它给了我什么,我什么时候需要使用这种模式?它能给我带来什么好处吗?
不仅仅是因为在NO-thread-aware体系中编译BOOST线程库(名称中没有-mt),我真的很困惑。这对我没有任何意义。看起来自相矛盾:/
非常感谢您的帮助!
答案 0 :(得分:19)
因为你没有具体说明你的构建方式,并且在什么平台上,我将解释整个故事。在Linux和Windows上,Boost.Thread库都是在MT模式下构建的。在Windows上,默认情况下,为它获取-mt后缀。在Linux上,默认情况下为1.42,没有后缀。你在Linux上没有后缀的原因是,几乎没有其他的库使用这样的约定,而且无论如何它在Linux上都不那么重要。
这是否澄清了事情?
答案 1 :(得分:16)
可以选择将“-mt”后缀放回(bjam --layout=tagged
)
--layout=<layout> Determines whether to choose library names
and header locations such that multiple
versions of Boost or multiple compilers can
be used on the same system.
versioned - Names of boost binaries
include the Boost version number, name and
version of the compiler and encoded build
properties. Boost headers are installed in a
subdirectory of <HDRDIR> whose name contains
the Boost version number.
tagged -- Names of boost binaries include the
encoded build properties such as variant and
threading, but do not including compiler name
and version, or Boost version. This option is
useful if you build several variants of Boost,
using the same compiler.
system - Binaries names do not include the
Boost version number or the name and version
number of the compiler. Boost headers are
installed directly into <HDRDIR>. This option
is intended for system integrators who are
building distribution packages.
The default value is 'versioned' on Windows, and
'system' on Unix.
答案 2 :(得分:3)
MT在boost库中启用多线程支持,这意味着您可以安全地在多线程程序中使用它们(至少从库的内部代码角度来看)。
确实在“无线程”模式下构建线程库没有任何意义,但我的印象是该特定的构建目标被禁用。
检查这些
http://sodium.resophonic.com/boost-cmake/current-docs/build_variants.html
http://www.boost.org/doc/libs/1_41_0/more/getting_started/windows.html#library-naming
答案 3 :(得分:3)
您可以使用多线程支持构建Boost(threading = multi | single)。 Boost.Thread通过在其Jamfile(相当于Makefile的bjam)中设置threading = multi来强制构建库。
因此,无论您是否请求线程支持,Boost.Thread始终提供它。因此,你可以找到这两个名字。
答案 4 :(得分:1)
因为在Linux下,-mt版本别名/绑定到常规版本,所以没有区别。在香草现代系统中,两者都包含在内以便于编辑。
答案 5 :(得分:0)
我不是Boost大师,但我认为是这样的:
在MT环境中,任何全局或共享数据可能有多个线程同时尝试访问它,这可能导致数据损坏。 MT-aware对象将使用同步(Critical Sections,Mutexes等)来确保一次只能有一个线程访问数据。
Boost线程库中可能存在仍可在单线程程序中运行的函数。或者,函数可以解析为无操作(无害的无用函数),以便可以使用MT(和boost函数工作)或单线程(并且boost函数无效)编译相同的程序,而无需更改代码。