2012-01-26 10 views
26

Actualmente, estoy implementando un proyecto multi-thread usando std::thread en C++ 11. Yo uso std::condition_variable para sincronizar hilos. En detalle, una función de consumidor llama a wait() función de miembro de std::condition_variable para esperar la tarea desde una cola de tareas global, otra función de productor genera y coloca tareas en la cola. Pero no sé la diferencia entre notify_all() y notify_one() funciones miembro de std::condition_variable. ¿Qué función debería usar en la función de productor? ¡Gracias!¿Cuál es la diferencia entre notify_all() y notify_one() de std :: condition_variable?

Respuesta

22

Si hay diez hilos bloqueados en la variable de condición, por ejemplo, notify_one() desbloqueará solo un hilo, mientras que notify_all() los desbloqueará todos. En su caso, querrá usar notify_one() para no despertar los hilos que no tienen ningún trabajo esperándolos.

+1

Gracias, GMan. Leí algunos documentos de internet. Justo como lo dijiste. Sin embargo, normalmente la función wait() se usa en un mutex, p. std :: unique_lock ul (m_mutexTask); while (m_lTask.empty()) {m_condTask.wait (ul); }. Entonces, incluso notify_all() activa todos los hilos, solo hay un hilo que puede bloquear el mutex, ¿verdad? –

+6

Solo un hilo bloqueará el mutex a la vez, pero todos regresarán de la 'espera 'tan pronto como obtengan el mutex. –

+13

@Yun: Cuál usar depende realmente de si alguno de los hilos de espera puede manejar lo que se espera. Si alguno lo haría (por ejemplo, múltiples lectores idénticos en una cola), entonces usa notify_one ya que es definitivamente más eficiente. Si hay una condición más compleja tal que solo un hilo en espera podría tener éxito con la condición de bucle, debe activarlos todos ya que no puede controlar qué thread será despertado por notify_one. –

Cuestiones relacionadas