21xrx.com
2025-07-08 04:44:39 Tuesday
文章检索 我的文章 写文章
C++ 等待线程结束的方法
2023-06-30 03:49:29 深夜i     19     0
C++ 等待 线程结束 方法

C++ 中多线程是一种常见的编程模式,但是在多线程编程中,等待其他线程结束却不会阻塞当前线程,也是一个很重要的问题。本文介绍了一些在 C++ 中等待其他线程结束的方法。

1. 使用 join() 方法等待线程结束

使用 join() 方法等待线程结束是一种常见的方法。使用这种方法,主线程会等待所有的子线程都结束之后再继续执行下去。

示例代码:

#include <iostream>
#include <thread>
void my_thread_func()
  std::cout << "Thread running.." << std::endl;
int main()
{
  std::thread t1(my_thread_func);
  if (t1.joinable())
  {
    t1.join();
    std::cout << "Thread ended" << std::endl;
  }
  else
  
    std::cout << "Thread not joinable" << std::endl;
  
  return 0;
}

在这个示例代码中,我们定义了一个线程函数 my\_thread\_func(),它只是简单地输出一行信息。在 main() 函数中,我们创建了一个线程 t1 来运行这个函数,然后使用 join() 方法等待线程结束。

当 join() 方法被调用时,主线程会一直等待直到 t1 线程结束。注意,在调用 join() 方法之前,需要使用 joinable() 方法判断线程是否是可联合的,即线程是否已经开始运行。

2. 使用条件变量等待线程结束

另一种等待线程结束的方法是使用条件变量。条件变量是一种可用于线程间通信的同步机制,可以让线程等待某个条件被满足。

这种方法适用于当主线程需要等待多个子线程都结束之后才能继续执行的情况。示例代码如下:

#include <iostream>
#include <thread>
#include <vector>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv_finished;
bool all_finished = false;
void my_thread_func(int i)
{
  std::cout << "Thread " << i << " running.." << std::endl;
  std::this_thread::sleep_for(std::chrono::seconds(i));
  std::cout << "Thread " << i << " finished" << std::endl;
  std::unique_lock<std::mutex> lock(mtx);
  all_finished = true;
  cv_finished.notify_all();
}
int main()
{
  std::vector<std::thread> threads;
  for (int i = 0; i < 3; ++i)
  {
    threads.push_back(std::thread(my_thread_func, i));
  }
  std::unique_lock<std::mutex> lock(mtx);
  while (!all_finished)
  {
    cv_finished.wait(lock);
  }
  std::cout << "All threads finished" << std::endl;
  for (auto& t : threads)
  {
    if (t.joinable())
    {
      t.join();
    }
  }
  return 0;
}

在这个示例代码中,我们创建了三个线程来运行 my\_thread\_func() 函数。在主线程中,我们使用条件变量 cv\_finished 和互斥锁 mtx 来等待所有线程都结束。在 my\_thread\_func() 函数中,我们使用互斥锁锁住 all\_finished 变量,在函数执行完后通知主线程。

注意,在使用条件变量时,需要使用互斥锁来保护条件变量。在等待条件变量时,主线程会自动释放锁,直到条件变量被通知后再重新获取锁。

总结

以上是 C++ 等待线程结束的两种常见方法:使用 join() 方法和条件变量。在使用多线程编程时,需要注意线程的安全性和相互之间的同步。在等待线程结束时,要保证线程之间的顺序和同步。

  
  

评论区