假設我有一個應該定期執行一些任務的線程,但是這個時間段是每小時6次每小時12次(每5分鐘),我經常看到控制線程的代碼循環用is_running標誌,它被選中的每一個迴路,這樣的:停止長時間睡眠線程
std::atomic<bool> is_running;
void start()
{
is_running.store(true);
std::thread { thread_function }.detach();
}
void stop()
{
is_running.store(false);
}
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
std::this_thread::sleep_for(5min);
}
}
但如果stop()
函數被調用,讓我們說,start()
後1毫秒的線程會活着299999額外毫秒,直到醒來,檢查旗幟,並死亡。
我的理解是否正確?如何避免保持活着(但睡眠)應該已經結束的線程?我的最好的方法到現在爲止是這樣的:
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
for (unsigned int b = 0u, e = 1500u; is_running.load() && (b != e); ++b)
{
// 1500 * 200 = 300000ms = 5min
std::this_thread::sleep_for(200ms);
}
}
}
是否有髒更小,更簡單的方式來實現這一目標?
_每小時(每5分鐘)_6次,每小時12次或每10分鐘一次? :) –
@AlexandreLavoie多麼失敗!謝謝,我會糾正它! :) –
http://en.cppreference.com/w/cpp/thread/condition_variable,看第一句話。而不是睡一段固定的時間,你在這段時間內進入一個可信的等待狀態,這樣其他線程仍然可以中斷你 – stijn