¿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?
c++
multithreading
c++11
pthreads
Shamdor
fuente
fuente
std::async
std::thread
questd::thread
opthreads
no.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::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 nativostd::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 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::thread
funciona principalmente en Android nativo. Algunas clases, comostd::timed_mutex
todavía no están implementadas.fuente
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 ++. Lastd::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.fuente
+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 sobrepthread
porque debería hacer que su aplicación esté más preparada para el futuro.fuente
boost::thread
en Win64 o Bionic (Android), porquestd::thread
todavía carece de partes importantes, donde en Linuxstd::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.
fuente
std::thread
trae 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