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?
26
A
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.
Cuestiones relacionadas
- 1. ¿Cuál es la diferencia entre std :: condition_variable y std :: condition_variable_any?
- 2. ¿Cuál es la diferencia entre std :: set y std :: vector?
- 3. ¿Cuál es la diferencia entre std :: merge y std :: set_union?
- 4. ¿Cuál es la diferencia entre std :: valarray y std :: array
- 5. ¿Cuál es la diferencia entre std :: string y std :: basic_string? ¿Y por qué se necesitan ambos?
- 6. ¿Cuál es la diferencia práctica entre std :: nth_element y std :: sort?
- 7. ¿Cuál es la diferencia entre std :: string :: c_str y std :: string :: data?
- 8. ¿Cuál es la diferencia entre dict() y {}?
- 9. Cuál es la diferencia entre = y: =
- 10. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 11. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 12. ¿cuál es la diferencia entre:.! y: r !?
- 13. ¿Cuál es la diferencia entre ".equals" y "=="?
- 14. ¿Cuál es la diferencia entre {0} y ""?
- 15. ¿Cuál es la diferencia entre .ToString (+) y ""
- 16. Cuál es la diferencia entre $ (...) y `...`
- 17. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 18. ¿Cuál es la diferencia entre + = y = +?
- 19. ¿Cuál es la diferencia entre " " y ""?
- 20. Cuál es la diferencia entre $ y jQuery
- 21. ¿Cuál es la diferencia entre std :: quick_exit y std :: abort y por qué se necesitó std :: quick_exit?
- 22. ¿Cuál es la diferencia entre cstdlib y stdlib.h?
- 23. ¿Cuál es la diferencia entre ssize_t y ptrdiff_t?
- 24. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 25. Cuál es la diferencia entre la función() {}() y la función() {}()
- 26. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 27. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 28. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 29. ¿Cuál es la diferencia entre el colado y la coerción?
- 30. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
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? –
Solo un hilo bloqueará el mutex a la vez, pero todos regresarán de la 'espera 'tan pronto como obtengan el mutex. –
@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. –