2012-10-12 16 views
13

Sono nuovo di std :: thread. Ho bisogno di mettere un thread per dormire da un altro thread, è possibile? In esempi, tutto quello che vedo è un codice simile:Come std :: thread sleep

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

Ma quello che voglio fare è qualcosa di simile:

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

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

Tutte le idee?

+4

Onestamente, la soluzione migliore è quella di risolvere qualsiasi problema si sta avendo un modo ragionevole. Non c'è davvero alcuna ragione per cui tu voglia mai mettere un thread per dormire da un altro thread. Se il thread sta facendo il lavoro che vuoi fare ora, perché metterlo a dormire? Se il thread non sta facendo il lavoro che vuoi fare ora, allora il suo codice è rotto e dovresti risolverlo. –

+2

Probabilmente quello che vuoi veramente usare è 'std :: condition_variable' e i suoi metodi come' wait (...) 'o' wait_for (...) ' – hirschhornsalz

risposta

19

Perché sleep_for è sincrono, ha davvero senso solo nel thread corrente. Quello che vuoi è un modo per sospendere/riprendere altri thread. Lo standard non fornisce un modo per farlo (afaik), ma è possibile utilizzare metodi dipendenti dalla piattaforma utilizzando native_handle.

Ad esempio su Windows, SuspendThread e ResumeThread.

Ma più importante è che non c'è quasi mai bisogno di farlo. Di solito quando incontri cose basilari di cui hai bisogno che lo standard non fornisce, è una bandiera rossa che stai percorrendo un percorso di progettazione pericoloso. Considera di raggiungere il tuo obiettivo più grande in un modo diverso.

+0

La" bandiera rossa "è un consiglio valido e molto buono! Ma anche non assoluto, quindi pensaci attentamente: il linguaggio cambia continuamente a causa dei programmatori che scoprono continuamente punti deboli, svantaggi, sviste, estensioni utili e fallimenti. – CarlH

9

No. Lo standard non ti dà una tale struttura, e non dovrebbe. Cosa fa il sonno? Mette in pausa l'esecuzione di un determinato thread per almeno un determinato periodo di tempo. Possono forse sapere altri thread senza sincronizzare il fatto che il thread specificato possa essere messo in sleep per ottenere prestazioni migliori?

No. È necessario fornire un'interfaccia sincronizzata, in grado di contrastare il guadagno di prestazioni dei thread. L'unico thread che ha le informazioni necessarie se è ok per dormire è il thread stesso. Pertanto std::thread non ha alcun membro sleep, mentre std::this_thread ne ha uno.

Problemi correlati