BOOST библиотеки в режиме многопоточности - PullRequest
27 голосов
/ 19 февраля 2010

Существует возможность компилировать библиотеки BOOST в так называемом режиме с поддержкой потоков.Если это так, вы увидите, что "...- MT ..." появилось в названии библиотеки.Я не могу понять, что это дает мне и когда мне нужно использовать такой режим?Это дает мне какие-то преимущества?

Более того, меня действительно смущает, что библиотека BOOST Threads скомпилирована в режиме без учета потоков (без имени в имени -mt)Это не имеет никакого смысла для меня.Выглядит противоречиво: /

Большое спасибо за любую помощь!

Ответы [ 6 ]

19 голосов
/ 22 февраля 2010

Поскольку вы не указали, как вы создали и на какой платформе, я объясню всю историю. Как в Linux, так и в Windows библиотека Boost.Thread встроена в режим MT. В Windows по умолчанию вы получите суффикс -mt. В Linux по умолчанию в 1.42 у вас нет суффикса. Причина, по которой вы не получаете суффиксов в Linux, заключается в том, что ни одна другая библиотека не использует такое соглашение, и в любом случае это гораздо менее важно в Linux.

Это проясняет ситуацию?

16 голосов
/ 15 июня 2011

Существует возможность вернуть суффикс "-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 голосов
/ 27 апреля 2010

Вы можете создать Boost с поддержкой многопоточности или нет (threading = multi | single). Boost.Thread форсирует сборку библиотеки, устанавливая threading = multi в ее Jamfile (эквивалент bjam Makefile).

Таким образом, независимо от того, запрашиваете ли вы поддержку потоков или нет, Boost.Thread всегда предоставляет ее. Следовательно, вы можете найти оба имени.

3 голосов
/ 19 февраля 2010

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

1 голос
/ 10 сентября 2013

Поскольку в Linux версия -mt является псевдонимом / привязана к обычной версии, это не имеет значения. В современной ванильной системе оба просто включены для простоты компиляции.

0 голосов
/ 19 февраля 2010

Я не бустер-гуру, но я предполагаю, что это так:

В среде MT любые глобальные или общие данные могут иметь более одного потока, пытающегося получить к ним доступ одновременно, что может привести к повреждению данных. MT-осведомленный объект будет использовать синхронизацию (критические секции, мьютексы и т. Д.), Чтобы гарантировать, что только один поток может одновременно получать доступ к данным.

В библиотеке потоков Boost могут быть функции, которые по-прежнему работают в однопоточных программах. В качестве альтернативы, функции могут преобразовываться в no-ops (безвредные функции бездействия), так что одну и ту же программу можно скомпилировать с помощью MT (и функции повышения работают) или однопоточными (и функции повышения ничего не делают) без необходимости изменять код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...