2010-02-19 18 views
26

Existe la posibilidad de compilar bibliotecas BOOST en el llamado modo thread-aware. Si es así, verá "...- mt ..." en el nombre de la biblioteca. No puedo entender lo que me da y cuándo debo usar ese modo. ¿Me da algún beneficio?Bibliotecas BOOST en modo multithreading-aware

Más que eso, estoy realmente confundido al tener compilada la biblioteca de BOOST Threads en un régimen SIN-thread-aware (sin -mt en el nombre). No tiene ningún sentido para mí. Parece contradictorio:/

¡Muchas gracias por cualquier ayuda!

Respuesta

0

no soy un gurú Boost, pero supongo que es la siguiente:

En un entorno de MT, los datos globales o compartidos pueden tener más de un hilo tratando de acceder a él, al mismo tiempo, lo que puede conducir a la corrupción de datos. Un objeto compatible con MT utilizará la sincronización (Secciones críticas, Mutexes, etc.) para garantizar que solo un hilo pueda acceder a los datos a la vez.

Puede haber funciones en la biblioteca de subprocesos Boost que aún funcionen en programas de subproceso único. Alternativamente, las funciones pueden resolverse en modo no operativo (funciones inofensivas para hacer nada) para que el mismo programa pueda compilarse con MT (y las funciones de refuerzo funcionan) o con una sola rosca (y las funciones de refuerzo no hacen nada) sin tener que cambiar el código.

+1

Sí, tiene sentido. Sin embargo, todavía estoy confundido con el hecho de que tengo una biblioteca de hilos sin -mt en su nombre.Dicen que 'la variante SINGLE_THREADED del proyecto boost_thread está deshabilitada'. pero no tengo - libboost_thread.so.1.42.0 - en mi carpeta. ¿Es error o hice algo mal? – musthero

3

MT habilita la compatibilidad con subprocesos múltiples en las bibliotecas de refuerzo, lo que significa que puede usarlas con seguridad en sus programas multiproceso (al menos desde el punto de vista del código interno de la biblioteca).

Y, de hecho, construir la biblioteca de hilos en el modo "sin hilos" no tiene ningún sentido, pero tenía la impresión de que ese objetivo de compilación específico está deshabilitado.

comprobar estos

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

Gracias, Mario. ¡Es útil! Sin embargo, todavía no sé cómo pude compilar threads library sin '-mt' si está habilitado de forma predeterminada para compilar en este modo solamente (esto es lo que tengo en mi carpeta lib - libboost_thread.so.1.42.0) Acabo de seguir las instrucciones de la página web BOOST. – musthero

18

Debido a que no se ha especificado cómo se han construido, y en qué plataforma, voy a explicar toda la historia. Tanto en Linux como en Windows, la biblioteca Boost.Thread está construida en modo MT. En Windows, de forma predeterminada, obtiene el sufijo -mt para ello. En Linux, por defecto en 1.42, no obtiene ningún sufijo. La razón por la que no obtienes ningún sufijo en Linux es que prácticamente ninguna otra biblioteca usa esa convención, y de todos modos es mucho menos importante en Linux.

¿Esto aclara las cosas?

+0

Según lo que dices, la convención de nomenclatura en 1.42 ha sido modificada. De hecho, esto está de acuerdo con lo que veo. ¿Va a ser una convención estándar a partir de ahora? (Quiero decir no -mt en el nombre en Linux) ¡Gracias Vladimir! – musthero

+0

Sí, a partir de ahora construir con las opciones predeterminadas en Linux producirá bibliotecas sin -mt. –

+1

Entonces, ¿cómo se distinguen las bibliotecas de thread aware de las bibliotecas normales? –

2

Puede construir Boost con soporte multi-threading o no (threading = multi | single). Boost.Thread fuerza la compilación de la biblioteca configurando threading = multi en su Jamfile (el equivalente bjam de un Makefile).

Por lo tanto, independientemente de si solicita soporte de subprocesamiento o no, Boost.Thread siempre lo proporciona. Por lo tanto, puedes encontrar ambos nombres.

15

hay una opción para poner el sufijo "-mt" de nuevo (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

Dado que, bajo Linux, la versión -mt es alias/enlazado a la versión normal, no hace ninguna diferencia. En un sistema moderno y vanidoso, ambos se incluyen simplemente para facilitar la compilación.

Cuestiones relacionadas