21xrx.com
2024-12-22 23:46:42 Sunday
登录
文章检索 我的文章 写文章
C++如何等待线程结束?
2023-07-09 04:17:25 深夜i     --     --
C++ 等待 线程 结束

在C++中,线程的使用已经成为了几乎所有现代应用程序的必要部分。线程可以在后台执行单独的任务,从而使应用程序更加高效和灵活。但是,当应用程序需要等待线程完成其任务并返回结果时,就需要使用某种方法来等待线程结束。在本文中,将介绍在C++中等待线程结束的几种方法。

1. 使用join()方法

C++中的std::thread类提供了诸如join()、detach()、get_id()和swap()等方法,我们可以利用它们来管理线程。其中,join()方法可以用来等待线程结束。简单来说,join()就是让主线程等待子线程执行完成。当一个线程调用join()方法时,它会暂停并等待线程结束。当线程执行完成时,join()方法将返回,主线程接着继续执行。

例如,以下代码演示了如何使用join()方法等待线程结束:

 c++

#include <thread>

#include <iostream>

void threadFunction()

{

  std::cout << "Thread function start" << std::endl;

  //模拟线程执行任务

  std::this_thread::sleep_for(std::chrono::milliseconds(1000));

  std::cout << "Thread function end" << std::endl;

}

int main()

{

  std::cout << "Main thread start" << std::endl;

  std::thread t(threadFunction);

  //等待线程执行完成

  t.join();

  std::cout << "Main thread end" << std::endl;

  return 0;

}

在上面的代码中,我们首先定义了一个线程函数threadFunction(),当线程t启动时,它会执行我们定义的线程函数。然后我们调用join()方法,使主线程等待线程t的执行完成。在这里,当线程函数执行完成后,我们会在控制台上看到相应的输出信息。最后,主线程也将继续执行并输出它自己的信息。

2. 使用detach()方法

使用detach()方法,可以将线程从主线程中分离出来并在后台执行。当线程运行在detach()方法中时,主线程就不会再等待线程的执行完成。如果主线程结束了,那么线程也将随之终止而不会继续执行。使用detach()的缺点在于无法获取线程的返回值,因此在使用时要谨慎。

下面的代码演示了如何使用detach()方法分离线程:

 c++

#include <thread>

#include <iostream>

void threadFunction()

{

  std::cout << "Thread function start" << std::endl;

  //模拟线程执行任务

  std::this_thread::sleep_for(std::chrono::milliseconds(1000));

  std::cout << "Thread function end" << std::endl;

}

int main()

{

  std::cout << "Main thread start" << std::endl;

  std::thread t(threadFunction);

  //分离线程

  t.detach();

  std::cout << "Main thread end" << std::endl;

  return 0;

}

在上面的代码中,我们与前一个例子的唯一区别是,现在我们使用detach()方法来分离线程。在这里,当线程开始执行后,主线程将不再等待线程的执行完成,而是继续执行并输出信息。

3. 使用future和promise

使用std::future和std::promise是另一种等待线程结束的方法。promise是一个对象,允许我们将线程的处理结果传递给一个future对象,future对象可以让线程的调用者等待它。使用std::async创建线程和使用promise/future显然是不同的,但是后者提供了更加灵活的方式来等待线程的完成。

下面的代码演示了如何使用promise/future等待线程的完成:

 c++

#include <thread>

#include <iostream>

#include <future>

void threadFunction(std::promise<int> &promiseObj)

{

  std::cout << "Thread function start" << std::endl;

  //模拟线程执行任务

  std::this_thread::sleep_for(std::chrono::milliseconds(1000));

  std::cout << "Thread function end" << std::endl;

  promiseObj.set_value(42);

}

int main()

{

  std::cout << "Main thread start" << std::endl;

  std::promise<int> promiseObj;

  std::future<int> futureObj = promiseObj.get_future();

  std::thread t(threadFunction, std::ref(promiseObj));

  //等待线程执行完成并获取线程返回值

  int result = futureObj.get();

  std::cout << "Thread returned " << result << std::endl;

  std::cout << "Main thread end" << std::endl;

  return 0;

}

在本例中,我们首先创建了一个std::promise对象promiseObj,并获取了一个与之相关的std::future对象futureObj。然后,当线程启动时,我们将std::promise对象作为参数传递给它,并在线程函数执行完成时,通过调用promiseObj.set_value()来设置返回值。最后,在主线程中,我们调用futureObj.get()以等待线程的执行完成,并获取线程的返回值。在示例代码中,当线程函数执行完成时,我们将会在控制台上看到相应的输出信息。

综上所述,C++提供了多种等待线程结束的方法,我们可以根据应用程序的需求选择适当的方法。使用join()方法是最常用的等待线程结束的方法,但是我们也可以使用detach()方法将线程分离开来。使用promise/future的方法则提供了更加灵活的方式,以等待线程的执行完成并获取返回值。请据此综合考虑选择适当的方法。

  
  

评论区

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