簡體   English   中英

如何優雅地喚醒或終止處於睡眠狀態的std :: thread?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM