pthread_join - threads c++
¿PThread es una buena opción para el programa multi-platorm C/C++ multi-threading? (5)
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.
Si hoy quiero escribir un programa en C o C ++ que realice varios subprocesos y que el 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, 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 mínimamente posible sobre las API de subprocesamiento de Windows existentes.
ADDENDUM EDIT:
Estoy inclinado a ir con el impulso: hilo - También quiero poder usar C ++ try / catch control de excepciones también. Y aunque mi programa será bastante mínimo y no particularmente OOPish, me gusta encapsular usando clase y espacio de nombres, en oposición a las funciones C incorpóreas.
No, pthreads normalmente no están disponibles en Windows. (Hay algunos intentos de implementarlo, pero al menos no es compatible con el sistema operativo).
Si está escribiendo C ++, Boost es, como de costumbre, 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 subprocesos como para la API de subprocesos de Windows.
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 - una biblioteca de threads de estilo STL
- Bloques de construcción de subprocesos de Intel
- OpenMP : ambos son una forma de alto nivel de escribir aplicaciones con subprocesos sin necesidad de realizar ninguna conversación.
Como estos últimos son totalmente compatibles en 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 usar Pthreads-w32 ), entonces quizás los últimos sean una mejor opción. boost :: threads son más como una biblioteca de threading, los otros 2 son formas de alto nivel para lograr el paralelismo sin necesidad de codificar ''threads'', te permiten escribir bucles que se ejecutan al mismo tiempo de forma automática (sujeto a condiciones de sentido común)
Sin embargo, Boost :: thread no es una biblioteca compatible con C.
editar : habilidades multiplataforma de lo anterior:
Intel TBB es multiplataforma (Windows *, Linux * y Mac OS * X), admite aplicaciones de 32 y 64 bits y funciona con compiladores de Intel, Microsoft y GNU.
OpenMP depende del compilador que desee utilizar, pero los compiladores de GCC y / o Intel han admitido OpenMP Windows, Linux y MacOS.
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.
Este 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, por ejemplo, CThread, que tenga implementaciones .cpp separadas para cada plataforma y una función de ejecutar puro-virtual () que se llame después de que se construya / ejecute tu subproceso.
Eso permite que todo su código de creación de subprocesos y 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.
P.ej
// ThreadTypes.h
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX)
typedef DWORD ThreadID
#elif defined(PLATFORM_PS3)
// etc etc
#endif
Así es como he escrito todo mi código de encriptación multiplataforma para plataformas como PC / PS2 / PS3 / 360 / Wii. También es un buen patrón a seguir para cosas como mutex y semáforos, que si tienes hilos seguramente necesitarás en algún momento :)
Apuesto a ZThread
API simple, más fácil de usar que PThreads y GRATIS
Eche un vistazo a ting también: http://code.google.com/p/ting/
Es una plataforma cruzada entre Windows y Linux. No hay soporte para Mac OS todavía.