21xrx.com
2024-09-20 00:03:51 Friday
登录
文章检索 我的文章 写文章
如何在 C++ 中实现主线程等待其他线程结束
2023-06-26 12:12:43 深夜i     --     --
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 类实现线程之间的同步。根据具体需求,选择适合的方法进行线程之间的同步和协作,可以提高程序的安全性和可靠性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复