我有一個上傳文件的後臺線程。它運行在一個循環中;它做了一些工作,然後睡覺,直到超時過去,或直到通過條件變量明確通知需要做更多工作。問題是,有時我無法讓線程快速退出。如何退出後臺線程循環?
下面是一個簡化版本:
std::thread g_thread;
std::mutex g_mutex;
std::condition_variable g_cond;
bool g_stop = false;
void threadLoop()
{
while (!g_stop)
{
printf("doing some stuff\n");
std::unique_lock<std::mutex> lock(g_mutex);
g_cond.wait_for(lock, std::chrono::seconds(15));
}
}
int main(int argc, char* argv[])
{
g_stop = false;
g_thread = std::thread(threadLoop);
printf("hello\n");
g_stop = true;
g_cond.notify_one();
g_thread.join();
}
當我運行這個測試程序,我希望它很快退出,但有時卡在wait_for()。我想也許notify_one()在線程在wait_for()中睡眠之前發生,但在g_stop檢查之後。
有沒有一個簡單的解決方案,或其他設計模式,會更好?
您應該將g_stop的類型更改爲'atomic_bool',以避免**未定義的行爲**,從不介意緩存問題。或者只在持有互斥鎖的同時閱讀它。 –
我不確定C++中的方法,但基本上當線程處於睡眠狀態時,使其響應的唯一方法是發送一個信號。在C中,它將使用'int pthread_kill(pthread_t thread,int sig)'; – AxFab
@AxFab,不,這沒有幫助。它正在等待條件變量,所以你通過通知該條件變量來解鎖它。 –