variable thread c++ multithreading c++11 mutex condition-variable

thread - condition variable c++



Diferencias entre variables condicionales, mutexes y bloqueos (2)

En la página a la que se refiere, "mutex" es la primitiva de sincronización de bajo nivel real. Puedes tomar un mutex y luego soltarlo, y solo un hilo puede tomarlo en cualquier momento (de ahí que sea una primitiva de sincronización). Un mutex recursivo es aquel que puede tomarse por el mismo hilo varias veces, y luego debe liberarse tantas veces por el mismo hilo antes de que otros puedan tomarlo.

Un "bloqueo" aquí es simplemente una clase contenedora de C ++ que toma un mutex en su constructor y lo libera en el destructor. Es útil para establecer la sincronización de los ámbitos de C ++.

Una variable de condición es una forma más avanzada / de alto nivel de primitiva de sincronización que combina un bloqueo con un mecanismo de "señalización". Se usa cuando los hilos necesitan esperar a que un recurso esté disponible. Un hilo puede "esperar" en un CV y ​​luego el productor de recursos puede "señalar" la variable, en cuyo caso los hilos que esperan el CV son notificados y pueden continuar su ejecución. Un mutex se combina con CV para evitar la condición de carrera en la que un hilo comienza a esperar en un CV al mismo tiempo que otro hilo quiere señalizarlo; entonces no se puede controlar si la señal se entrega o si se pierde.

Por ejemplo, las interfaces c ++ 0x

Me está costando mucho imaginar cuándo usar qué cosas (cv, mutex y lock). ¿Alguien puede explicar o señalar un recurso?

Gracias por adelantado.


No estoy muy familiarizado con C ++ 0x así que tome esta respuesta con un grano de sal.

re: Mutex vs. bloqueos: de la documentación que publicó, parece que un mutex es un objeto que representa un mutex del sistema operativo, mientras que un lock es un objeto que contiene un mutex para facilitar el patrón de RAII .

Las variables de condición son un mecanismo útil para asociar un mecanismo de bloqueo / señalización (señal + espera) con un mecanismo de exclusión mutua, pero las mantienen desacopladas en el sistema operativo para que usted, como programador del sistema, pueda elegir la asociación entre condvar y mutex. (útil para tratar con múltiples conjuntos de objetos accedidos simultáneamente) Rob Krten tiene algunas buenas explicaciones sobre condvars en uno de los capítulos en línea de su libro sobre QNX .

En cuanto a referencias generales: Este libro (no publicado aún) parece interesante.