¿Por qué debería preferir uno u otro en la práctica? ¿Cuáles son las diferencias técnicas, excepto que std::threades una clase?
c++
multithreading
c++11
pthreads
Shamdor
fuente
fuente

std::asyncstd::threadquestd::threadopthreadsno.Respuestas:
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::threadestá 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::threadDesafortunadamente, 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 nativostd::threado 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 astd::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::threadfunciona principalmente en Android nativo. Algunas clases, comostd::timed_mutextodavía no están implementadas.fuente
std::thready su estilo raii es bueno porque puede manejar excepciones de C ++ mientras que pthreads no puede salir de la caja.La
std::threadbiblioteca 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::threades una biblioteca de clase C ++. Lastd::threadbiblioteca incluye muchas características abstractas, por ejemplo: bloqueos de ámbito, mutex recursivos, implementaciones de patrones de diseño futuro / prometedor y más.fuente
+1de mi parte para señalar lo más importante, a saber, que std :: thread ofrece un mayor nivel de abstracción.std::threadproporciona 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::threadpuede que aún no esté completa en todas las plataformas. Aún así, (será en el futuro cercano) debería ser favorecido por sobrepthreadporque debería hacer que su aplicación esté más preparada para el futuro.fuente
boost::threaden Win64 o Bionic (Android), porquestd::threadtodavía carece de partes importantes, donde en Linuxstd::threadparece 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.
fuente
std::threadtrae seguridad de tipo que pthread no tiene.El OpenMP
http://www.openmp.org/
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.
fuente