21xrx.com
2024-11-05 16:34:56 Tuesday
登录
文章检索 我的文章 写文章
如何获取C++多线程函数的返回值?
2023-06-30 06:49:03 深夜i     --     --
C++ 多线程 返回值 获取方法

多线程是C++语言中一个非常强大的功能。它使得程序能够同时执行多个任务,从而提高了程序的执行效率。但是,在使用多线程时,我们经常需要获取函数返回值。本文将介绍如何获取C++多线程函数的返回值。

1. 使用全局变量

一个简单的方法是定义一个全局变量,将函数的返回值赋值给这个全局变量。这样,在主线程中就可以读取这个全局变量并使用其中的值。


#include <iostream>

#include <thread>

int result = 0;

void myThreadFunc(int a, int b) {

  result = a + b;

}

int main() {

  std::thread t(myThreadFunc, 10, 20);

  t.join();

  std::cout << "Result: " << result << std::endl;

  return 0;

}

在上面的示例中,我们定义了一个全局变量result,将函数myThreadFunc的返回值赋值给这个变量。在主线程中,我们读取这个全局变量并输出其值。

2. 使用std::promise和std::future

另一个方法是使用std::promise和std::future。std::promise用于保存一个值,std::future用于获取这个值。


#include <iostream>

#include <thread>

#include <future>

int myThreadFunc(int a, int b) {

  return a + b;

}

int main() {

  std::promise<int> p;

  std::future<int> f = p.get_future();

  std::thread t([&p]() {

    int result = myThreadFunc(10, 20);

    p.set_value(result);

  });

  t.join();

  std::cout << "Result: " << f.get() << std::endl;

  return 0;

}

在上面的示例中,我们使用std::promise来保存函数myThreadFunc的返回值,使用std::future来获取这个值。我们在主线程中先创建一个std::promise对象,然后调用get_future方法获取一个std::future对象。在子线程中,我们使用std::promise的set_value方法来保存返回值。在主线程中,我们调用std::future的get方法来获取这个返回值。

3. 使用lambda表达式

另一个方法是使用lambda表达式。我们可以将函数的返回值作为lambda表达式的参数,并在子线程中调用这个lambda表达式。


#include <iostream>

#include <thread>

int myThreadFunc(int a, int b) {

  return a + b;

}

int main() {

  int result = 0;

  std::thread t([&result]() {

    result = myThreadFunc(10, 20);

  });

  t.join();

  std::cout << "Result: " << result << std::endl;

  return 0;

}

在上面的示例中,我们将函数myThreadFunc的返回值作为lambda表达式的参数,并将其赋值给变量result。在子线程中,我们调用这个lambda表达式。在主线程中,我们读取变量result并输出其值。

结论

以上是三种获取C++多线程函数返回值的方法。使用全局变量是最简单的方法,但可能会导致可读性较差和线程不安全的问题。使用std::promise和std::future能够较好地解决线程安全问题,并且可以应用于多线程之间传递数据。使用lambda表达式则是一种简单的做法,适用于简单的程序。

  
  

评论区

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