2010-02-19 10 views
26

Istnieje możliwość kompilacji bibliotek BOOST w tak zwanym trybie wątku. Jeśli tak, zobaczysz w nazwie biblioteki "...- mt ...". Nie rozumiem, co mi to daje i kiedy muszę użyć takiego trybu? Czy daje mi to jakieś korzyści?Biblioteki BOOST w trybie wielowątkowości

Co więcej, jestem naprawdę zdezorientowany, ponieważ BOOST biblioteka wątków została skompilowana w reżimie bez wątku (bez nazwy -mt w nazwie). Dla mnie to nie ma sensu. Wygląda na sprzeczne:/

Wielkie dzięki za pomoc!

Odpowiedz

0

Nie jestem guru Boost, ale zakładam, że jest to:

W środowisku MT wszelkie globalne lub wspólnych danych może mieć więcej niż jeden wątek próbuje uzyskać do niego dostęp w tym samym czasie, co może doprowadzić do uszkodzenia danych. Obiekt świadomy MT użyje synchronizacji (Sekcje krytyczne, Muteksy itp.), Aby zapewnić, że tylko jeden wątek może uzyskać dostęp do danych na raz.

Mogą istnieć funkcje w bibliotece wątków doładowania, które nadal działają w programach jednowątkowych. Alternatywnie, funkcje mogą zostać rozwiązane do no-ops (nieszkodliwe funkcje do-nothing), aby ten sam program mógł zostać skompilowany z MT (i funkcje doładowania działają) lub Single threaded (a funkcje boost nie działają) bez konieczności zmiany kod.

+1

Tak, to ma sens. Jednak nadal jestem mylony z faktem, że mam bibliotekę wątków bez nazwy -mt w jej nazwie.Mówią, że "wariant SINGLE_THREADED projektu boost_thread jest wyłączony". ale ja mam - libboost_thread.so.1.42.0 - w moim folderze. Czy to błąd, czy zrobiłem coś złego? – musthero

3

MT umożliwia obsługę wielowątkową w bibliotekach doładowania, co oznacza, że ​​można bezpiecznie używać ich w programach wielowątkowych (przynajmniej z punktu widzenia kodu wewnętrznego biblioteki).

Rzeczywiście tworzenie biblioteki wątków w trybie "bez wątków" nie ma sensu, ale miałem wrażenie, że ten konkretny cel kompilacji jest wyłączony.

Sprawdź je

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

+0

Dzięki, Mario. To jest pomocne! Jednak nadal nie wiem, w jaki sposób udało mi się skompilować bibliotekę wątków bez '-mt', jeśli jest ona domyślnie włączona do kompilowania tylko w tym trybie (to jest to, co mam w moim folderze lib - libboost_thread.so.1.42.0). Po prostu wykonałem instrukcje ze strony BOOST. – musthero

18

Ponieważ nie określił, w jaki sposób zostały zbudowane, a na co platforma, będę wyjaśnić całą historię. Zarówno w systemie Linux, jak i Windows, biblioteka Boost.Thread jest zbudowana w trybie MT. W systemie Windows domyślnie otrzymasz sufiks -mt. W systemie Linux domyślnie w wersji 1.42 nie ma żadnego przyrostka. Powodem, dla którego nie ma sufiksu na Linuksie, jest to, że żadna inna biblioteka nie używa takiej konwencji, a i tak jest to o wiele mniej ważne w Linuksie.

Czy to wyjaśnia rzeczy?

+0

Zgodnie z tym, co mówisz, zmieniono konwencję nazewnictwa w 1.42. W rzeczywistości zgadza się to z tym, co widzę. Czy od teraz będzie to normalna konwencja? (Mam na myśli no-mt w nazwie na Linux) Dzięki Vladimir! – musthero

+0

Tak, od teraz budowanie z domyślnymi opcjami na Linuksie będzie produkować biblioteki bez -mt. –

+1

Jak zatem odróżnić biblioteki wątków od zwykłych bibliotek? –

2

Można zbudować wzmocnienie z obsługą wielu wątków lub nie (gwintowanie = multi | single). Boost.Thread wymusza kompilację biblioteki, ustawiając threading = multi w pliku Jamfile (odpowiednik pliku Makefile).

Niezależnie od tego, czy użytkownik żąda obsługi wątków, czy też nie, funkcja Boost.Thread zawsze je udostępnia. Stąd możesz znaleźć oba imiona.

15

Istnieje możliwość, aby umieścić "-MT przyrostek" back (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. 
1

Ponieważ pod Linuksem, wersja -MT jest aliasem/bound do regularnej wersji, to nie ma znaczenia. W nowoczesnym, waniliowym systemie oba są po prostu dołączane w celu ułatwienia kompilacji.

Powiązane problemy