C++多线程之带返回值的线程处理函数解读

 更新时间:2022年11月25日 09:18:45   作者:Tihu灌顶  
这篇文章主要介绍了C++多线程之带返回值的线程处理函数解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

No.1 async:创建执行线程

1.1 带返回值的普通线程函数

第一步: 采用async:启动一个异步任务,(创建线程,并且执行线程处理函数),返回值future对象

第二步: 通过future对象中的get()方法获取线程返回值

#include <iostream>
#include <thread>
#include <future>
using namespace std;
int testThreadOne()
{
	cout<<"testThreadOne_id:"<<this_thread::get_id()<<endl;
	return 1001;
}
void testAsync1()
{
	future<int> result = async(testThreadOne);
	cout<<result.get()<<endl;
}

1.2 带返回值的类成员函数

class Tihu
{
public:
	int TihuThread(int num)
	{
		cout<<"TihuThread_id"<<this_thread::get_id()<<endl;
		num *= 2;
		this_thread::sleep_for(2s);
		return num;
	}
}
void testAsync2()
	Tihu tihu;
	future<int> result = async(&Tihu::TihuThread,&tihu,1999);
	cout<<result.get()<<endl;
}

1.3 async的其他参数

  • launch::async: 创建线程并且执行线程处理函数
  • launch::deferred:线程处理函数延迟到 我们调用wait和get方法的时候才会执行,本质是没有创建子线程的

No.2 thread:创建线程

2.1 packaged_task: 打包线程处理函数

  • 通过类模板 packaged_task 包装线程处理函数
  • 通过packaged_task的对象调用get_future获取future对象,再通过get()方法得到子线程处理函数的返回值
void testPackaged_task()
{	
	//1. 打包普通函数
	packaged_task<int(void)> taskOne(testThreadOne);//函数返回值加上参数类型
	thread testOne(ref(taskOne));//需要使用ref转换
	testOne.join();
	cout<<taskOne.get_future().get()<<endl;
	
	//2. 打包类中的成员函数
	//需要使用函数适配器进行封装
	Tihu tihu;
	packaged_task<int(int)> taskTwo(bind(&Tihu::TihuThread,&tihu,placeholders::_1));//如果有参数需要使用占位符
	thread testTwo(ref(taskTwo),20);
	testTwo.join();
	cout<<testTwo.get_future().get()<<endl;

	//3. 打包Lambda表达式
	packaged_task<int(int)> taskThree([](int num)
	{
		cout<<"thread_id:"<<this_thread::get_id()<<endl;
		num *= 10;
		return num;
	});
	thread testTwo(ref(taskThree),7);
	testTwo.join();
	cout<<testTwo.get_future().get()<<endl;
	
}

2.2 promise: 获取线程处理函数“返回值”

第一步: promise类模板,通过调用set_value存储函数需要返回的值

第二步: 通过get_future()获取future对象,再通过get()方法获取线程处理函数中的值

void testPromiseThread(promise<int>& temp,int data)
{
    cout<<"testPromise"<<this_thread::get_id()<<endl;
    data *= 3;
    temp.set_value(data);
}
void testPromise()
{
    promise<int> temp;
    thread testp(testPromiseThread,ref(temp),19);
    testp.join();
    cout<<temp.get_future().get()<<endl;
}
int main()
{
    testAsync1();
    testAsync2();

    testPackaged_task();

    testPromise();
    
    return 0;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • OpenCV实现特征检测和特征匹配方法汇总

    OpenCV实现特征检测和特征匹配方法汇总

    一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点,本文主要介绍了OpenCV实现特征检测和特征匹配方法,感兴趣的可以了解一下
    2021-08-08
  • 浅谈几种常见语言的命名空间(Namespace)

    浅谈几种常见语言的命名空间(Namespace)

    本文给大家简单介绍了下几种常见语言的命名空间的特性以及简单示例,大家对比下,有需要的小伙伴可以参考下
    2016-03-03
  • C语言如何利用辗转相除法求最大公约数

    C语言如何利用辗转相除法求最大公约数

    这篇文章主要介绍了C语言如何利用辗转相除法求最大公约数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Qt5实现qDebug日志信息写入日志文件过程

    Qt5实现qDebug日志信息写入日志文件过程

    这篇文章主要为大家介绍了Qt5实现qDebug日志信息写入日志文件的过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 基于C语言实现钻石棋游戏的示例代码

    基于C语言实现钻石棋游戏的示例代码

    独立钻石是源于18世纪法国的宫廷贵族的自我挑战类单人棋游戏,可以锻炼逻辑思维能力。本文将用C语言实现这一简单的游戏,感兴趣的小伙伴可以了解一下
    2023-02-02
  • Windows下VScode实现简单回声服务的方法

    Windows下VScode实现简单回声服务的方法

    回声服务端可以将客户端传来的信息,再原封不动地发送给客户端,因而得名 epoch 服务。接下来通过本文给大家介绍Windows下VScode实现简单回声服务的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • C++ boost::asio编程-同步TCP详解及实例代码

    C++ boost::asio编程-同步TCP详解及实例代码

    这篇文章主要介绍了C++ boost::asio编程-同步TCP详解及实例代码的相关资料,需要的朋友可以参考下
    2016-11-11
  • C语言用函数指针实现一个特别的计算器

    C语言用函数指针实现一个特别的计算器

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言用函数指针实现计算器的方法,需要的朋友可以参考下
    2022-07-07
  • C++拷贝构造函数和赋值运算符重载详解

    C++拷贝构造函数和赋值运算符重载详解

    拷贝构造函数是特殊的构造函数,是用一个已经存在的对象,赋值拷贝给另一个新创建的已经存在的对象,这篇文章主要介绍了C++拷贝构造函数和赋值运算符重载,需要的朋友可以参考下
    2024-05-05
  • C++控制台实现随机生成路径迷宫游戏

    C++控制台实现随机生成路径迷宫游戏

    这篇文章主要为大家详细介绍了C++控制台实现随机生成路径迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论