21xrx.com
2025-04-12 09:25:26 Saturday
文章检索 我的文章 写文章
如何在 C++ 中实现主线程等待其他线程结束
2023-06-26 12:12:43 深夜i     15     0
C++ 线程 等待 结束 主线程

C++ 是一种非常流行的编程语言,它提供了多线程编程的支持。在多线程编程中,某些任务可能需要在主线程中等待其他线程执行完毕,才能继续执行。在这篇文章中,我们将介绍如何在 C++ 中实现主线程等待其他线程结束。

使用 std::thread.join() 方法

C++ 中的 std::thread 类提供了一个 join() 方法,可以使主线程等待其他线程完成。join() 方法的调用会阻塞主线程,直到调用它的线程执行完成。因此,对于需要等待其他线程完成的任务,可以在主线程中调用 join() 方法等待其他线程执行完成。

示例:

#include <iostream>
#include <thread>
void thread_func()
  std::cout << "Hello from thread!" << std::endl;
int main()
{
  std::thread t(thread_func);
  
  // 等待其他线程执行完成
  t.join();
  
  std::cout << "Hello from main thread!" << std::endl;
  
  return 0;
}

在上面的示例中,我们创建了一个新的线程 t,并在其中执行 thread_func() 函数。在主线程中,我们调用了 t.join() 方法等待线程 t 执行完毕,然后输出 Hello from main thread!。

使用 std::thread.detach() 方法

除了使用 join() 方法,还可以使用 detach() 方法来分离线程。detach() 方法的调用将使其他线程继续执行,而主线程不再等待该线程完成。

示例:

#include <iostream>
#include <thread>
void thread_func()
  std::cout << "Hello from thread!" << std::endl;
int main()
{
  std::thread t(thread_func);
  
  // 分离线程
  t.detach();
  
  std::cout << "Hello from main thread!" << std::endl;
  
  return 0;
}

在上面的示例中,我们创建了一个新的线程 t,并在其中执行 thread_func() 函数。在主线程中,我们调用了 t.detach() 方法分离线程 t,然后输出 Hello from main thread!。由于主线程不再等待线程 t 完成,因此线程 t 可能会在主线程执行之后仍然继续运行。

使用 std::promise 和 std::future

除了使用 std::thread 类,C++ 还提供了 std::promise 和 std::future 类来实现线程之间的同步。std::promise 用于设置值或异常,而 std::future 用于检索 std::promise 中的值或异常。

示例:

#include <iostream>
#include <thread>
#include <future>
void thread_func(std::promise<int>& p)
{
  std::cout << "Hello from thread!" << std::endl;
  
  // 模拟长时间的计算任务
  std::this_thread::sleep_for(std::chrono::seconds(3));
  
  int result = 42;
  
  // 将结果保存到 promise 中
  p.set_value(result);
}
int main()
{
  std::promise<int> p;
  
  // 获取对 promise 对象的共享状态的 future 对象
  std::future<int> f = p.get_future();
  
  std::thread t(thread_func, std::ref(p));
  
  // 等待线程执行完成并获取结果
  int result = f.get();
  
  std::cout << "Result: " << result << std::endl;
  
  t.join();
  
  std::cout << "Hello from main thread!" << std::endl;
  
  return 0;
}

在上面的示例中,我们创建了一个新的线程 t,并在其中执行 thread_func() 函数。在主线程中,我们创建了一个 std::promise 对象 p,并从中获取 std::future 对象 f。在线程 t 中,我们执行了一个模拟长时间计算的任务,并将结果保存到 promise 对象中。在主线程中,我们调用了 f.get() 方法等待线程 t 执行完毕并获取结果。然后我们输出结果并等待线程 t 完成。

总结

使用 std::thread 类的 join() 和 detach() 方法,可以在 C++ 中实现主线程等待其他线程执行完毕。除此之外,也可以使用 std::promise 和 std::future 类实现线程之间的同步。根据具体需求,选择适合的方法进行线程之间的同步和协作,可以提高程序的安全性和可靠性。

  
  

评论区

请求出错了