Библиотеки 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 не выполняют ничего), не изменяя код.