2010-04-01 12 views
24

Estoy buscando una biblioteca de threading multiplataforma fácil de usar escrita en C++.¿Hay alguna biblioteca de threading multiplataforma en C++?

¿Cuál es su opinión sobre boost::thread o Pthreads? ¿Pthreads se ejecuta solo en sistemas compatibles con POSIX?

¿Qué pasa con el soporte de subprocesos en la biblioteca Qt?

+4

Si considera Boost.Threads o Qt, debe eliminar la etiqueta 'C'. – sbi

+3

Sin mencionar que no hay un lenguaje de programación llamado C/C++. Como puede ver aquí, el término lleva a la confusión. –

Respuesta

33

Boost.Thread es el borrador de la próxima biblioteca de threading estándar del lenguaje C++. Sabiendo eso, prefiero usarlo ya que proporciona algunas garantías sólidas (porque se convierte en estándar).

Actualización: Ahora que tenemos las bibliotecas de threading estándar, algunas más precisiones. Algunas construcciones de impulso, como boost :: shared_mutex, no han sido estandarizadas (pero podrían ser posteriores). Sin embargo, la biblioteca estándar explota mejor el movimiento semántico. Es bueno saber antes de elegir una biblioteca. Además, el uso de la biblioteca de threads C++ 11 requiere un compilador que lo proporcione. No es el caso para todos los compiladores de hoy.

Actualización: Ahora [Nov2012] la mayoría de los compiladores estándar proporcionan la biblioteca de threads C++ 11. VS2012, GCC4.8 y Clang3.1 tienen soporte para hilos y primitivas de sincronización y operaciones atómicas. Para una implementación completa también puede usar solo hilo de Anthony Williams. Es una biblioteca compatible con C++ 11 compatible con Windows/Mac y Linux.

Enlaces para el estado de C++ 11 características con varios compiladores:

+0

Sé que esta respuesta es antigua, pero me gustaría añadir que gcc 4.6 no compilará Boost.Thread en modo C++ 11.Esto podría ser un problema en cualquiera de ellos, pero lo más probable es que gcc, ya que el soporte de C++ 11 está en desarrollo en este momento. –

+0

Agregaré que todavía tiene que tener un compilador que proporcione la biblioteca de subprocesamiento estándar para usarlo, o de lo contrario dependerá de la mejora. – Klaim

0

SDL es simple, multiplataforma y tiene soporte de roscado.

+0

SDL es más bien una biblioteca multimedia, ¿o no? Prefiero tener algo más limpio. – NumberFour

4

Pthreads funcionan solo en sistemas POSIX. QThread de Qt es una manera de hacerlo. Está disponible en plataformas: Linux, Mac OS X, Windows, Embedded Linux, Windows CE, Symbian, Maemo.

+2

¿Qué quieres decir con "Todas las plataformas" – osgx

+3

Sí, tengo este chip aquí en mi tostadora, ¿Qt está disponible para eso? ':)' – sbi

+0

Con soporte oficial, win/mac/unix + x/embedded unix/wince/symbian/meamo - Probablemente más que impulso. –

2

Qt tiene un buen soporte de subprocesos. Si solo necesita crear un hilo y ejecutar algún código en él, QThread es todo lo que necesita. Hay muchas otras clases de alto nivel que pueden ayudarlo con los grupos de subprocesos o incluso abstraer la ejecución simultánea (el marco QtConcurrent).

+1

Qt tiene una buena biblioteca de threading; funciona muy bien para aplicaciones Qt ya que puede conectar señales a través de hilos. Si está utilizando elementos Qt, me quedaría con los hilos Qt. – Will

0

Pthread es parte de Posix, pero no todos los sistemas posix tendrán hilos. pthreads es más portátil.

¿Qué plataformas soportarás?

+0

Bueno, Pthreads no tiene problemas para ejecutarse en Linux y otros sistemas Unix, supongo. Pero, ¿qué pasa con Pthreads en Windows? – NumberFour

+0

Utilizo pthreads en WIndows (compilado en cygwin). Entonces hay apoyo. –

8

Hay una la biblioteca de threading viene con C++ 11. Se basa en la biblioteca de enhebrado de refuerzo. Desafortunadamente, parece recordar que existen diferencias no triviales entre Boost.Threads y C++ 11. Aún así, si planea cambiar a la biblioteca de threading estándar de C++, creo que Boost.Threads es lo más cercano que puede llegar a tener ahora.

Supongo que, bajo el capó, estas bibliotecas utilizarán Pthreads en sistemas POSIX y cualquier soporte de threading nativo disponible en otro lugar.

Descargo de responsabilidad: No he trabajado con ninguno de los dos.

4

También eche un vistazo a OpenMP, es un conjunto de (algo estándar) pragma s especificaciones que es compatible con most major compilers. Lo bueno de OpenMP es que es simple y que su código se puede compilar fácilmente tanto en versiones simples como multiproceso.

Sólo un ejemplo sencillo:

std::vector<double> a, b; 
... 
double sum = 0.0; 
... 
#pragma omp parallel for reduction(+:sum) 
    for (i=0; i < n; i++) 
    sum = sum + (a[i] * b[i]); 

Es obvio que es posible hacerlo también morecomplexthings.

+0

¿OpenMP también es compatible con Windows? – NumberFour

+0

Sí, OpenMP es compatible con Windows, Visual Studio 2005 y versiones posteriores y, por supuesto, los compiladores de Intel. –

+0

Y no debería introducir ninguna dependencia. – baol

1

wxWidgets tiene clases de subprocesos, y como wxWidgets es independiente de la plataforma, podría ser lo mejor para usted.

2

Lista de las plataformas correspondientes. Si solo está utilizando, digamos, Linux/Mac/Windows, entonces boost :: thread probablemente le servirá hasta que C++ 0x (harhar) proporcione std :: thread.

1

Boost.Threads se basa en PThreads en sistemas UNIX y Win32 Threads en Windows.

La biblioteca de impulso es sintácticamente simple y todo el peliagudo asunto de interconectar correctamente el código C++ con las bibliotecas C se ocupa de detrás de escena. Sin embargo, si no está muy cómodo con C++, PThreads podría parecer más sencillo con su API C simple.

Qt Threads es también una buena biblioteca, pero debido a que utilizo muchas otras bibliotecas de refuerzo, recopilaré y vincularé contra Boost sin importar nada. Es posible que no siempre enlace contra Qt. Y, bueno, simplemente no quiero recordar cómo usar dos bibliotecas diferentes.

2

He utilizado pthreads para código que funciona en múltiples plataformas. Para evitar la falta de pthreads de Windows, he utilizado la siguiente biblioteca de código abierto con gran éxito: POSIX Threads for Windows

+0

pthreads-w32 es de la vieja escuela. mingw-w64 proporciona una versión mejorada llamada winpthreads. – cap

3

Me sorprende que nadie haya mencionado el Intel TBB library (vinculado a otra respuesta mía). Además, un task-based implementation should be preferred sobre una base de subprocesos.

+0

Sí, también el futuro modelo asincrónico en C++ 11 es bastante fácil de usar. Para Windows, solo PPL es muy similar a TBB y está bien respaldado por MS – Sarang

Cuestiones relacionadas