2012-10-12 79 views
13

我是新來的std ::線程。我需要把線從另一個線程睡覺,這可能嗎?在示例中,我看到的是這樣的代碼:如何標準::線程睡眠

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

但我想要做的是一樣的東西:

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

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

任何想法?

+4

老實說,最好的解決方案是解決你有什麼問題,你有一些明智的方法。真的沒有理由讓你想把線程從另一個線程中喚醒。如果線程正在做你現在想做的工作,爲什麼要把它睡覺?如果線程沒有完成你現在想做的工作,那麼它的代碼被破壞了,你應該修復它。 –

+2

可能你真正想使用的是'std :: condition_variable'和它的方法,比如'wait(...)'或'wait_for(...)' – hirschhornsalz

回答

19

因爲sleep_for是同步的,所以它在當前線程中才有意義。你想要的是一種暫停/恢復其他線程的方法。該標準沒有提供執行此操作的方法(afaik),但您可以使用平臺相關的方法使用native_handle

例如在Windows上,SuspendThreadResumeThread

但更重要的是,幾乎從不需要這樣做。通常當你遇到基本的東西時,你需要標準沒有提供的東西,這是一個紅旗,你正在走向危險的設計路徑。考慮以不同的方式完成更大的目標。

+0

「紅旗」是有效和非常好的建議!但也不是絕對的,所以要認真思考 - 程序員不斷髮現弱點,缺點,疏忽,有用的擴展和失敗的結果,語言不斷變化。 – CarlH

9

不是。標準不給你這樣的設施,它不應該。睡眠做什麼?它會暫停給定線程的執行至少一段給定的時間。其他線程可能知道沒有同步給定線程可以進入睡眠,以獲得更好的性能?

不需要。您將不得不提供一個同步接口,這將對抗來自線程的性能增益。線程本身是唯一具有所需信息的線程,不管它是否可以睡覺。因此std::thread沒有會員sleep,而std::this_thread有一個。