2010-02-19 17 views
26

Esiste la possibilità di compilare le librerie BOOST nella cosiddetta modalità thread-aware. Se è così vedrai "...- mt ..." apparso nel nome della biblioteca. Non riesco a capire cosa mi dà e quando devo usare questa modalità? Mi da benefici?Librerie BOOST in modalità multithreading

Oltre a ciò, sono davvero confuso dall'avere la libreria BOOST Threads compilata in modalità NO-thread-aware (senza -mt nel nome). Non ha alcun senso per me. Sembra auto-contraddittorio:/

Grazie mille per qualsiasi aiuto!

risposta

0

io non sono un guru Boost, ma suppongo che sia questo:

In un ambiente di MT, tutti i dati globali o in comune possono avere più di un thread nel tentativo di accedere allo stesso tempo, che può portare alla corruzione dei dati. Un oggetto che riconosce MT utilizzerà la sincronizzazione (sezioni critiche, mutex, ecc.) Per garantire che solo un thread possa accedere ai dati alla volta.

Potrebbero esserci delle funzioni nella libreria di thread Boost che funzionano ancora nei programmi a thread singolo. In alternativa, le funzioni possono essere risolte in no-ops (innocue funzioni do-nothing) in modo che lo stesso programma possa essere compilato con MT (e le funzioni boost funzionino) o Single threaded (e le funzioni boost non facciano nulla) senza dover cambiare il codice.

+1

Sì, ha senso. Comunque sono ancora confuso dal fatto che ho una libreria di thread senza -mt nel suo nome.Dicono che "la variante SINGLE_THREADED del progetto boost_thread è disabilitata." ma non ho - libboost_thread.so.1.42.0 - nella mia cartella. È un bug o ho fatto qualcosa di sbagliato? – musthero

3

MT consente il supporto multithread nelle librerie boost, il che significa che è sicuro utilizzarle nei programmi multithread (almeno dal punto di vista del codice interno della libreria).

E infatti la creazione della libreria di thread nella modalità "nessun thread" non ha alcun senso, ma avevo l'impressione che quel target specifico di build fosse disabilitato.

controllare questi fuori

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

Grazie, Mario. È utile! Tuttavia non so ancora come sono stato in grado di compilare la libreria di thread senza '-mt' se è abilitato di default per compilare solo in questa modalità (questo è quello che ho nella mia cartella lib - libboost_thread.so.1.42.0). Ho appena seguito le istruzioni dalla pagina web di BOOST. – musthero

18

Perché non è stato specificato come hai costruito, e su quale piattaforma, ti spiego tutta la storia. Sia su Linux che su Windows, la libreria Boost.Thread è costruita in modalità MT. Su Windows, per impostazione predefinita, si ottiene -mt suffisso per questo. Su Linux, per impostazione predefinita in 1.42, non si ottiene alcun suffisso. Il motivo per cui non si ottiene suffisso su Linux è che praticamente nessuna altra libreria usa tale convenzione, e comunque è molto meno importante su Linux.

Questo chiarisce le cose?

+0

In base a ciò che stai dicendo, la convenzione di denominazione in 1.42 è stata modificata. In effetti, questo è in accordo con ciò che vedo. D'ora in poi sarà una convenzione standard? (Voglio dire no -mt nel nome su Linux) Grazie Vladimir! – musthero

+0

Sì, d'ora in poi la costruzione con le opzioni predefinite su Linux produrrà librerie senza -mt. –

+1

Quindi come si distinguono le librerie con conoscenza filetica dalle librerie normali? –

2

È possibile creare Boost con supporto multi-threading o no (threading = multi | single). Boost.Thread forza la build della libreria impostando threading = multi nel suo Jamfile (l'equivalente bjam di un Makefile).

Quindi indipendentemente dal fatto che si richieda o meno il supporto per il thread, Boost.Thread fornisce sempre. Quindi puoi trovare entrambi i nomi.

15

C'è un'opzione per mettere suffisso "-MT" indietro (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

Dal momento che, sotto Linux, la versione -MT viene alias/legato alla versione normale, non fa alcuna differenza. In un moderno sistema vanilla, entrambi sono semplicemente inclusi per semplificare la compilazione.