tutorial threads thread pthread libreria library ejemplo algorithms c++ multithreading c++11 pthreads

threads - thread library c++



C++ 11 std:: threads vs posix threads (5)

El OpenMP

http://www.openmp.org/

es un estándar estandarizado de subprocesamiento múltiple basado en SMP que ya lleva más de una década trabajando en Linux y Windows. OpenMP está disponible de forma predeterminada con todos los compiladores, incluidos GCC y Microsoft Visual Studio.

Una cosa a tener en cuenta, al utilizar OpenMP, es que si hay más hilos que núcleos de CPU, entonces el rendimiento disminuirá debido a la sobrecarga relacionada con el cambio de contexto. Lo segundo a tener en cuenta es que la inicialización de un subproceso real del nivel del sistema operativo es relativamente costoso. La inicialización es una fracción de segundo, pero en algunas aplicaciones las fracciones muy pequeñas se acumulan a un costo considerable.

Para simultaneidad relacionada con requisitos de arquitectura de software Es posible que desee buscar alguna implementación de "subprocesos ligeros" o "subprocesos verdes" en lugar de utilizar OpenMP. La diferencia es que los hilos OpenMP son hilos de rosca reales, a nivel del sistema operativo, pero los "hilos verdes" pueden ser solo "hilos simulados" que se ejecutan utilizando una pequeña cantidad de hilos reales.

¿Por qué debería preferir uno u otro en la práctica? ¿Cuáles son las diferencias técnicas, excepto que std::thread es una clase?


La biblioteca std::thread se implementa sobre pthreads en un entorno compatible con pthreads (por ejemplo: libstdc ++).

Creo que la gran diferencia entre los dos es la abstracción. std::thread es una biblioteca de clases C ++. La biblioteca std::thread incluye muchas características abstractas, por ejemplo: bloqueos de ámbito, mutexes recursivos, implementaciones de patrones de diseño futuro / prometedor, y más.


Para mí, la diferencia técnica decisiva es la ausencia de primitivas de manejo de señal en std en oposición a pthreads. La incapacidad para dictar correctamente el manejo de señal en un proceso Unix usando std solo es AFAIK un defecto debilitante en el uso de std :: thread, ya que le impide a uno configurar el patrón de manejo de señal multi-threaded para procesar todas las señales en un dedicado enhebrarlos y bloquearlos en el resto. Te ves obligado a suponer que std :: thread está implementado usando pthreads y esperamos lo mejor cuando uses pthread_sigmask. El manejo adecuado de las señales no es negociable en la programación de sistemas Unix para la empresa.

Como en 2016, std :: thread es un juguete; simple como eso.


Si desea ejecutar código en muchas plataformas, busque Posix Threads. Están disponibles en casi todas partes y son bastante maduros. Por otro lado, si solo usas Linux / gcc std::thread está perfectamente bien, tiene un nivel de abstracción más alto, una interfaz realmente buena y juega muy bien con otras clases de C ++ 11.

Desafortunadamente, la clase C ++ 11 std::thread no funciona confiablemente (todavía) en todas las plataformas, incluso si C ++ 11 parece estar disponible. Por ejemplo, en Android estándar std::thread o Win64 simplemente no funciona o tiene cuellos de botella de rendimiento severo (a partir de 2012).

Un buen reemplazo es boost::thread - es muy similar a std::thread (en realidad es del mismo autor) y funciona de manera confiable, pero, por supuesto, introduce otra dependencia de una biblioteca de terceros.

Editar: A partir de 2017, std::thread funciona principalmente en Android nativo. Algunas clases, como std::timed_mutex aún no están implementadas.


std::thread proporciona portabilidad en diferentes plataformas como Windows, MacOS y Linux.

Como se menciona por @hirshhornsalz en los comentarios a continuación y la respuesta relacionada https://.com/a/13135425/1158895 , std::thread puede no estar completo en todas las plataformas todavía. Aún así, (lo será en el futuro cercano) debería ser favorecido sobre pthread porque debería hacer que su aplicación sea más a prueba de futuro.