[英]How to wake or terminate a sleeping std::thread gracefully?
#include <thread>
#include <chrono>
using namespace std:
void f()
{
// Sleeping for a very long while
while (SOCKET s = accept(listening_socket, ...))
{
// ...
}
}
int main()
{
std::thread t(f);
DoSomething();
t.???(); /* What to place here to wake/terminate thread f? */
}
在Win32下,我可以使用TerminateThread()
殺死線程。 但是我想要的是一種跨平台的方法來做到這一點。
我應該如何在C ++中優雅地做到這一點?
我建議您在廣播信號,信號量,條件變量或其他方面進行睡眠,而不要進行阻塞性睡眠。 然后,您的應用程序僅設置信號,任何正在睡眠的人都將醒來並可以退出。 這是一個更干凈的解決方案,因為它使線程主體有機會清理可能執行的所有操作-包括釋放鎖!
回應更新
在這種情況下, select
調用帶有超時的select
,然后再調用accept
。
第一個問題來自阻塞模式套接字接受,您應該使用非阻塞套接字模式。
您可以在while循環中設置一個標志,例如:
struct AcceptHandler
{
AcceptHandler()
: is_terminated(false)
{
}
void accept()
{
while(!is_terminated)
{
// select
// accept
cout << " in loop " << endl;
}
}
void terminate()
{
is_terminated = true;
}
private:
std::atomic<bool> is_terminated;
};
int main()
{
AcceptHandler ah;
std::thread t(std::bind(&AcceptHandler::accept, std::ref(ah)));
t.join(); /// this is just demo, it blocks here
ah.terminate();
return 0;
}
我在示例中使用了一個標志(is_terminated),您可以使用條件變量(首選方式)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.