¿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?
fuente
¿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?
Si desea ejecutar código en muchas plataformas, busque hilos Posix. Están disponibles en casi todas partes y son bastante maduros. Por otro lado, si solo usa Linux / gcc std::thread
está perfectamente bien: tiene un nivel de abstracción más alto, una interfaz realmente buena y funciona muy bien con otras clases de C ++ 11.
std::thread
Desafortunadamente, la clase C ++ 11 no funciona de manera confiable (todavía) en todas las plataformas, incluso si C ++ 11 parece estar disponible. Por ejemplo, en Android nativo std::thread
o Win64, simplemente no funciona o tiene graves cuellos de botella de rendimiento (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
todavía no están implementadas.
std::thread
y su estilo raii es bueno porque puede manejar excepciones de C ++ mientras que pthreads no puede salir de la caja.
La std::thread
biblioteca se implementa sobre pthreads en un entorno que admite pthreads (por ejemplo: libstdc ++).
Creo que la gran diferencia entre los dos es la abstracción. std::thread
es una biblioteca de clase C ++. La std::thread
biblioteca incluye muchas características abstractas, por ejemplo: bloqueos de ámbito, mutex recursivos, implementaciones de patrones de diseño futuro / prometedor y más.
+1
de mi parte para señalar lo más importante, a saber, que std :: thread ofrece un mayor nivel de abstracción.
std::thread
proporciona portabilidad en diferentes plataformas como Windows, MacOS y Linux.
Como mencionó @hirshhornsalz en los comentarios a continuación y la respuesta relacionada https://stackoverflow.com/a/13135425/1158895 , std::thread
puede que aún no esté completa en todas las plataformas. Aún así, (será en el futuro cercano) debería ser favorecido por sobre pthread
porque debería hacer que su aplicación esté más preparada para el futuro.
boost::thread
en Win64 o Bionic (Android), porque std::thread
todavía carece de partes importantes, donde en Linux std::thread
parece bastante maduro.
Para mí, la diferencia técnica decisiva es la ausencia de primitivas de manejo de señal en std en lugar de pthreads. La incapacidad de dictar adecuadamente el manejo de la señal en un proceso de Unix usando solo std es AFAIK una falla debilitante en el uso de std :: thread ya que impide configurar el patrón de manejo de señales de subprocesos múltiples de buena fe para procesar todas las señales en un dedicado enhebrar y bloquearlos en el resto. Usted está obligado a asumir que std :: thread se implementa usando pthreads y espera lo mejor cuando usa pthread_sigmask. El manejo adecuado de las señales no es negociable en la programación de sistemas Unix para la empresa.
A partir de 2016, std :: thread es un juguete; simple como eso.
std::thread
trae seguridad de tipo que pthread no tiene.
El OpenMP
es un estándar multiproceso estandarizado basado en SMP que ha estado funcionando en Linux y Windows durante más de una década. OpenMP está disponible de forma predeterminada con todos los compiladores, incluidos GCC y Microsoft Visual Studio.
Una cosa a tener en cuenta, cuando se usa OpenMP, es que si hay más subprocesos que núcleos de CPU, entonces el rendimiento disminuirá debido a la sobrecarga relacionada con el cambio de contexto. La segunda cosa a tener en cuenta es que la inicialización de un subproceso real a nivel de 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 la concurrencia relacionada con los requisitos de la arquitectura de software Es posible que desee buscar alguna implementación de "hilos ligeros" o "hilos verdes" en lugar de utilizar OpenMP. La diferencia es que los hilos de OpenMP son reales, a nivel del sistema operativo, hilos, pero los "hilos verdes" pueden ser simplemente "hilos simulados" que se ejecutan utilizando un pequeño número de hilos reales.
std::async
std::thread
questd::thread
opthreads
no.