c++ - 如何优雅地唤醒或终止 sleep 中的 std::thread?

标签 c++ multithreading c++11 cross-platform portability

#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++ 中优雅地做到这一点?

最佳答案

我建议在广播信号、信号量、条件变量或其他东西上休眠,而不是进行阻塞休眠。然后您的应用程序只需设置信号,任何正在 sleep 的人都会醒来并可以退出。这是一个更简洁的解决方案,因为它让线程主体有机会清理它可能正在做的任何事情——包括释放锁!

响应更新
在这种特定情况下,在调用 accept 之前调用带有超时的 select

关于c++ - 如何优雅地唤醒或终止 sleep 中的 std::thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14887067/

相关文章:

c++ - 有没有办法使用独立的 `std::begin` 和 const_iterator?

c++ - C++17 中的新表达式求值顺序

c - 如何检查 Windows 程序的 C++ 文件是否存在?

java - Spring 和线程安全

python - 如何捕获 python threading.Thread 执行中发生的异常?

c++ - GCC 警告已声明但 undefined variable

c++11 - 枚举对继承的支持

c++ - 具有引用成员变量的多态性

c++ - 使用 std::remove_if() 时没有可行的重载 '='

c++ - 将 boost::asio::post 用于接受参数的函数