栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++异步std::future与std::async创建后台任务并返回值

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++异步std::future与std::async创建后台任务并返回值

#include
#include
#include
#include
#include
#include

int mythread() {	//线程入口函数
	std::cout << "mythread() start" << "threadid=" << std::this_thread::get_id() << std::endl;//打印新线程id
	std::chrono::milliseconds dura(1000);//顶一份一秒的时长
	std::this_thread::sleep_for(dura);
	std::cout << "mythread()end" << "threadid=" << std::this_thread::get_id() << std::endl;
	return 5;
}

class A {
public:
	int mythread(int a) {	
		std::cout << a << std::endl;
		std::cout << "mythread() start" << "threadid=" << std::this_thread::get_id() << std::endl;//打印新线程id
		std::chrono::milliseconds dura(1000);//顶一份五秒的时长
		std::this_thread::sleep_for(dura);
		std::cout << "mythread()end" << "threadid=" << std::this_thread::get_id() << std::endl;
		return 5;
	}
};
void test() {		//类成员函数传参版本
	A a;
	int i = 10;
    //std::futureresult = std::async(std::launch::deferred, &A::mythread, &a, i);
    std::futureresult = std::async(std::launch::async, &A::mythread, &a, i);
    //std::futureresult = std::async(&A::mythread, &a, i);        //默认方式,和上面的没区别
	std::cout << result.get() << std::endl;	//卡在这里等待mythread执行完毕,拿到结果
}
int main() {

	
	std::cout << "main " << "threadid=" << std::this_thread::get_id() << std::endl;
	std::futureresult = std::async(mythread);		//创建一个线程并开始执行,绑定关系,流程并不卡到这里
	std::cout << "continue......!" << std::endl;
	int def;
	def = 0;
	std::cout << result.get() << std::endl;	//卡在这里等待mythread执行完毕,拿到结果
	//std::cout << result.get() << std::endl;	//get()只能调用一次,不能调用多次
	//result.wait();	//等待线程返回,本身不返回结果
	std::cout << "I Love China!" << std::endl;
	test();
	return 0;
}

//我们通过向std::async()传递一个参数,该参数类型是std::lunnch类型(枚举类型),来达到一些特殊的目的
    //std::lanuch::deferred:表示线程入口函数被延迟到std::future的wait()或者get()函数调用时才执行
    //那如果wait()或者get()没有被调用,那么这个线程根本不会创建
    //std::lauch:延迟调用,并且没有创建新的线程,是在主线程中调用的线程入口函数:
    //std::lauch::async,在调用async函数的时候开始创建线程;
    //async()函数默认用std::lauch::async,所以只需要注意:std::lanuch::deferred

//一:std::async,future创建后台任务并返回值
//希望线程返回一个结果:
//std::async是个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,他返回一个std::future对象,std::future是个类模板

    //下列程序通过std::future对象的get()成员函数等待线程执行结束并返回结果
    //这个get()函数很牛,不拿到将来的返回值 誓不罢休,不拿到值就在这里等待拿值

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号