c++ wait for thread to finish with timeout

在 C++ 中,如果您想等待一个线程执行完毕,并设置超时时间,您可以使用 std::thread joinable() 方法和 std::chrono 库中的时间函数。

具体来说,您可以在启动线程后调用 joinable() 来检查线程是否可加入,如果是,则调用 join() 等待线程完成,如果在超时时间内线程未完成,则可以使用 detach() 分离线程并让其继续运行,或者抛出异常或采取其他适当的措施。

下面是一个示例代码:

#include <iostream>
#include <thread>
#include <chrono>
void foo() {
  std::this_thread::sleep_for(std::chrono::seconds(2));
  std::cout << "Thread finished" << std::endl;
int main() {
  std::thread t(foo);
  if (t.joinable()) {
    if (t.joinable()) {
      // 等待线程完成
      if (t.joinable()) {
        t.join();
      std::cout << "Thread joined" << std::endl;
    } else {
      // 超时
      t.detach();
      std::cout << "Thread detached" << std::endl;
  return 0;

在这个示例中,foo() 函数是一个简单的线程函数,它将线程暂停2秒钟,然后输出一条消息。

main() 函数中,我们启动了一个线程 t,并检查它是否可加入。如果是,我们调用 join() 等待线程完成,否则我们调用 detach() 分离线程并让其继续运行。在本例中,我们没有设置超时时间,因此线程要么会完成要么会一直运行下去。

如果您需要设置超时时间,请使用 std::chrono::steady_clock::now() 来获取当前时间,然后计算超时时间并等待线程完成或超时。具体来说,您可以使用以下代码:

#include <iostream>
#include <thread>
#include <chrono>
void foo() {
  std::this_thread::sleep_for(std::chrono::seconds(2));
  std::cout << "Thread finished" << std::endl;
int main() {
  std::thread t(foo);
  if (t.joinable()) {
    // 设置超时时间为1秒钟
    auto timeout = std::chrono::steady_clock::now() + std::chrono::seconds(1);
    // 等待线程完成或超时
    while (t.joinable() && std::chrono::steady_clock::now() < timeout) {
      t.join_for(std::chrono::milliseconds(100));
    if (t.joinable()) {
      // 超时
      t.detach();
      std::cout << "Thread detached" << std::endl;
    } else {
      // 线程完成
      std::cout << "Thread joined" << std::endl;
  return 0;

在这个示例中,我们设置超时时间为1秒钟,并在一个循环中等待线程完成或超时。我们每100毫秒检查

  •