c语言编程笔录

您现在的位置是:首页 > C语言 > C#

C#

C++多线程获取返回值方法详解

黎芸贵 2023-08-12C#
前言在多线程编程中,经常会遇到需要等待线程执行完毕并获取返回值的情况。C++提供了多种方法来实现这个目标,本文将详细介绍几种常用的方法。方法一:使用std::thread和std::futurestd::t

前言

在多线程编程中,经常会遇到需要等待线程执行完毕并获取返回值的情况。C++提供了多种方法来实现这个目标,本文将详细介绍几种常用的方法。

方法一:使用std::thread和std::future

std::thread是C++11引入的线程库,std::future用于保存异步操作的结果。可以通过结合使用这两个类来实现获取线程返回值的功能。

#include 
#include 
#include 

int foo()
{
  // 执行一些耗时的操作
  std::this_thread::sleep_for(std::chrono::seconds(2));
  return 42;
}

int main()
{
  std::future result = std::async(std::launch::async, foo);

  // 执行其他任务

  int value = result.get(); // 获取线程返回值
  std::cout << "线程返回值:" << value << std::endl;

  return 0;
}

在上面的代码中,使用std::async函数创建一个异步任务并返回std::future对象,然后可以通过调用std::future的get()函数获取线程的返回值。

方法二:使用自定义数据结构和互斥锁

如果不想使用std::future,也可以通过定义一个自定义的数据结构来传递线程的返回值,并使用互斥锁来保护数据的访问。

#include 
#include 
#include 

struct Result
{
  int value;
  bool ready;
  std::mutex mutex;
};

void foo(Result& result)
{
  // 执行一些耗时的操作
  std::this_thread::sleep_for(std::chrono::seconds(2));

  std::lock_guard lock(result.mutex);
  result.value = 42;
  result.ready = true;
}

int main()
{
  Result result;
  result.ready = false;

  std::thread t(foo, std::ref(result));

  // 执行其他任务

  t.join();

  {
    std::lock_guard lock(result.mutex);
    if (result.ready)
    {
      std::cout << "线程返回值:" << result.value << std::endl;
    }
    else
    {
      std::cout << "线程还未完成" << std::endl;
    }
  }

  return 0;
}

在上述代码中,定义了一个Result结构体,其中包含要返回的值和一个bool类型的变量表示线程是否已经完成。使用互斥锁来保护Result对象的访问,确保在获取返回值时不会出现冲突。

总结

本文介绍了两种常用的方法来获取C++多线程的返回值。通过使用std::thread和std::future可以简化线程的管理并获取返回值,而使用自定义数据结构和互斥锁可以手动实现对返回值的控制。在选择方法时,可以根据具体的需求和代码的复杂性来做出合适的选择。

文章评论