2009-01-31 19 views
13

He estado haciendo principalmente Java y smattering de .NET durante los últimos cinco años y no he escrito ninguna C o C++ significativa durante ese tiempo. Así que he estado alejado de esa escena por un tiempo.¿PThread es una buena opción para el programa multi-platorm C/C++ multi-threading?

Si hoy quiero escribir un programa en C o C++ que realice varios subprocesos y su código fuente sea portátil en Windows, Mac OS X y Linux/Unix, ¿es una buena opción?

El código C o C++ no hará ninguna GUI, por lo que no tendrá que preocuparse por nada de eso.

Para la plataforma de Windows, no quiero traer mucho equipaje Unix, sin embargo, en términos de bibliotecas de tiempo de ejecución de emulación de Unix. Preferiría una API de PThread para Windows que sea una envoltura lo más delgada posible sobre las API de subprocesamiento de Windows existentes.

ADENDA EDIT:

Am inclinándose hacia adelante con impulso: hilo - Yo también quiero ser capaz de utilizar C++ tratar/excepción captura manejo también. Y a pesar de que mi programa será bastante mínimo y no particularmente OOPish, me gusta encapsular utilizando clase y espacio de nombres - a diferencia de C funciones incorpóreas.

Respuesta

14

Bueno, pthreads es el antiguo estándar de posix para escribir programas enhebrados. Son las rutinas de subprocesamiento de nivel más bajo, por lo que es una buena opción para el enhebrado multiplataforma.

Sin embargo, hay alternativas:

  • boost::thread - un estilo STL threading biblioteca
  • de Intel Thread Building Blocks
  • OpenMP - estos dos son una forma de alto nivel de aplicaciones roscadas escritura sin necesidad para realizar llamadas de subprocesamiento.

Como estos últimos son totalmente compatibles con todas las plataformas, (pthreads requiere un poco de configuración del compilador como su única parte del subsistema POSIX de Windows, a menos que desee utilizar Pthreads-w32), entonces tal vez los últimos son una mejor elección. boost :: threads son más como una biblioteca threading, los otros 2 son formas de alto nivel para lograr el paralelismo sin necesidad de codificar 'hilos', te permiten escribir bucles que se ejecutan al mismo tiempo (sujeto a las condiciones de sentido común)

Boost :: thread no es una biblioteca compatible con C embargo.

edición: capacidades multiplataforma de lo anterior:

Intel TBB is cross-platform (Windows *, Linux * y Mac OS * X), ​​es compatible con aplicaciones de 32 bits y de 64 bits y funciona con los compiladores Intel, Microsoft y GNU .

OpenMP depende del compilador que desea utilizar, pero GCC y/o Intel compilers have supported OpenMP Windows, Linux y MacOS.

+0

"Como estas últimas son totalmente compatibles con todas las plataformas": si en todas las plataformas se habla de Windows y un par de plataformas * nix, entonces esto es cierto. Aparte de eso, no lo es. –

+0

ver mi edición. El OP nunca pidió nada más que esas 3 plataformas. – gbjbaanb

+0

Acepté esta respuesta porque presentaba la más amplia gama de información sobre posibles formas de proceder. – RogerV

4

No, pthreads normalmente no están disponibles en Windows. (Hay algunos intentos para implementarlo, pero al menos no es compatible con el sistema operativo).

Si está escribiendo C++, Boost es, como siempre, la respuesta. Boost.Thread tiene una biblioteca de threading portátil (y más segura).

En C, la solución más simple es probablemente envolver escribir un contenedor común tanto para pthreads como para la API de subprocesos de Windows.

11

Si necesita que su código sea realmente portátil, lo mejor es mantenerse alejado de las diversas bibliotecas que dispersan Internet. En algún momento, encontrará una plataforma que no admiten y luego tendrá que crear su propia sucursal.

Esto tampoco es un problema difícil de resolver y puede ser un buen ejercicio para crear código multiplataforma.

Te sugiero que crees una clase, p. CThread, que tiene implementaciones .cpp separadas para cada plataforma y una función pure-virtual execute() que se llama después de que se construye/ejecuta su subproceso.

Eso permite que todo su creación de hilo y el código de suspensión/apagado/prioridad se implemente utilizando la API más adecuada para la plataforma. También puede necesitar un encabezado (por ejemplo, ThreadTypes.h) que contenga define/typedefs para cada plataforma.

E.g.

// ThreadTypes.h 
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX) 
    typedef DWORD ThreadID 
#elif defined(PLATFORM_PS3) 
    // etc etc 
#endif 

Esta es la forma en que he escrito toda mi código enhebrado multiplataforma para plataformas como PC/PS2/PS3/360/Wii. También es un buen patrón a seguir para cosas como el mutex de semáforos y, que si tiene roscas que esté seguro a necesitar en algún momento :)

+0

Me encanta - ¡Votos anónimos de personas que probablemente nunca enviaron una aplicación en múltiples plataformas! ¡FTW! –

+0

Hola Andrew, publiqué la pregunta original. Estaba un poco sorprendido de ver que tu voto abajo también.He rodado clases delgadas de C++ sobre el enrutamiento de Win32; solo necesitaría abstraer eso a través de POSIX Pthreads y estaría listo. Por otro lado, está Pthreads-win32. Todo lo demás ya tiene Pthreads. – RogerV

+0

+1: la encapsulación es * siempre * tu amigo. Puede parecer un trabajo extra, pero ese tiempo extra mínimo finalmente te salvará el culo. Especialmente cuando alguien rompe el estándar y tiene valores de error inesperados para probar. –

0

voy a apostar por ZThread

API simple, fácil de usar que PThreads y libre

+0

¿Alguna idea de por qué estoy recibiendo tantos mensajes en mi consola cuando uso la biblioteca Zthread? Tales como 'ThreadQueue created',' User thread created', etc. Parece que estos son mensajes DEBUG de la biblioteca, ¿cómo puedo desactivarlos? – lqr

Cuestiones relacionadas