2012-10-12 84 views
13

Soy nuevo en std :: thread. Necesito poner un hilo para dormir de otro hilo, ¿es eso posible? En los ejemplos, todo lo que veo es un código como:Cómo std :: thread sleep

std::this_thread::sleep_for(std::chrono::seconds(1)); 

Pero lo que yo quiero hacer es algo como:

std::thread t([]{...}); 
t.sleep(std::chrono::seconds(1)); 

o sleep(t, std::chrono::seconds(1));

¿Alguna idea?

+4

Honestamente, la mejor solución es resolver cualquier problema que tenga de una manera sensata. Realmente no hay ninguna razón por la que deba querer poner un hilo a dormir desde otro hilo. Si el hilo está haciendo un trabajo que quieres hacer ahora, ¿por qué lo duermes? Si el hilo no está haciendo el trabajo que quieres hacer ahora, entonces su código está roto y debes arreglarlo. –

+2

Posiblemente lo que realmente quieres usar es 'std :: condition_variable' y sus métodos como' wait (...) 'o' wait_for (...) ' – hirschhornsalz

Respuesta

19

Debido sleep_for es sincrónico, en realidad sólo tiene sentido en el flujo actual. Lo que quiere es una forma de suspender/reanudar otros hilos. El estándar no proporciona una forma de hacerlo (afaik), pero puede usar métodos dependientes de la plataforma usando native_handle.

Por ejemplo en Windows, y SuspendThreadResumeThread.

Pero lo más importante es que casi nunca hay una necesidad de hacer esto. Por lo general, cuando encuentras cosas básicas que necesitas que el estándar no proporciona, es una señal de alerta que te diriges hacia un camino de diseño peligroso. Considere lograr su objetivo más grande de una manera diferente.

+0

¡La" bandera roja "es un consejo válido y muy bueno! Pero tampoco es absoluto, así que piénsalo detenidamente: el lenguaje cambia constantemente como resultado de que los programadores descubren continuamente debilidades, inconvenientes, descuidos, extensiones útiles y fallas. – CarlH

9

No. La norma no le da esa facilidad, y no debería. ¿Qué hace el sueño? Pausa la ejecución de un hilo determinado durante al menos la cantidad de tiempo dada. ¿Pueden otros hilos saber, sin sincronizar, que el hilo dado se puede dormir para lograr un mejor rendimiento?

No. tendría que proporcionar una interfaz sincronizado, lo que contrarrestar la ganancia de rendimiento a partir de hilos. El único hilo que tiene la información necesaria para saber si está bien dormir es el hilo en sí. Por lo tanto, std::thread no tiene ningún miembro sleep, mientras que std::this_thread tiene uno.