Библиотеки BOOST в режиме многопоточности
Существует возможность скомпилировать библиотеки BOOST в так называемом потоковом режиме. Если это так, вы увидите, что в имени библиотеки появилось "...- mt...". Я не могу понять, что это дает мне, и когда мне нужно использовать такой режим? Получает ли он какие-либо выгоды?
Более того, я действительно смущен тем, что библиотека BOOST Threads скомпилирована в режиме NO-thread-aware (без имени -mt в имени). Для меня это не имеет никакого смысла. Выражается противоречивость:/
Спасибо за помощь!
Ответы
Ответ 1
Потому что вы не указали, как вы построили, и на какой платформе я объясню всю историю. Как в Linux, так и в Windows, библиотека Boost.Thread встроена в режим MT. В Windows по умолчанию вы получаете для него -mt суффикс. В Linux по умолчанию в 1.42 вы не получаете суффикса. Причина, по которой вы не получаете суффикса в Linux, заключается в том, что в значительной степени никакая другая библиотека не использует такое соглашение, и в любом случае это гораздо менее важно для Linux.
Проясняет ли это вещи?
Ответ 2
Можно добавить суффикс "-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.
Ответ 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
Ответ 4
Вы можете создать Boost с поддержкой многопоточности или нет (threading = multi | single). Boost.Thread усиливает сборку библиотеки, установив threading = multi в свой Jamfile (эквивалент bjam Makefile).
Таким образом, независимо от того, запрашиваете ли вы поддержку потоков или нет, Boost.Thread всегда предоставляет его. Следовательно, вы можете найти оба имени.
Ответ 5
Так как в Linux версия -mt сглажена/привязана к обычной версии, это не имеет никакого значения. В современной ванильной системе оба просто включены для облегчения компиляции.
Ответ 6
Я не гуру Boost, но я предполагаю, что это:
В среде MT любые глобальные или общие данные могут иметь более одного потока, пытающихся получить к нему доступ в одно и то же время, что может привести к повреждению данных. Объект, поддерживающий MT, будет использовать синхронизацию (критические разделы, мьютексы и т.д.), Чтобы гарантировать, что только один поток может обращаться к данным за раз.
В библиотеке потоков Boost могут быть функции, которые все еще работают в однопоточных программах. В качестве альтернативы, функции могут быть разрешены к no-ops (безвредным функциям do-nothing), так что одна и та же программа может быть скомпилирована с MT (и работой надстройки) или Single threaded (и функции boost не выполняют ничего), не изменяя код.