C++多线程

C++多线程总结3

async_packaged_promise

  • 这些功能可以自动创建一个线程,并开始
    执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。
	std::future<int> result = std::async(mythread);
	cout << result.get() << endl;
	//result.wait();//get之后不能出现wait,但是wait可在get之前,
	//因为get是移动语义执行过后就将值交出去了
std::future对象的get()成员函数会等待线程执行结束并返回结果,拿不到结果它就会一直等待,感觉有点像join()。但是,它是可以获取结果的。
std::future对象的wait()成员函数,用于等待线程返回,本身并不返回结果,这个效果和 std::thread 的join()更像。
  1. async
    通过向std::async()传递一个参数,该参数是std::launch类型(枚举类型),来达到一些特殊的目的,不加入参数表示std::launch::async| std::lunch::deferred也就是说创建还是不创建由系统决定。
    std::lunch::deferred
    表示线程入口函数调用被延迟到std::future的wait()或者get()函数调用时才执行,如果此时wait()或者get()没有调用,线程不会创建,程序等待一会过后直接结束,不会影响主程序运行。
    std::future<int> result2 = std::async(std::launch::deferred, &A::mythread, &a, tmp); //第二个参数是对象引用才能保证线程里执行的是同一个对象
    
    std::launch::async
    在调用async函数的时候就开始创建线程但是与std::thread()不同,如果系统资源紧张std::thread()可能出现创建线程失败的情况,如果创建线程失败那么程序就可能崩溃,而且不容易拿到函数返回值。
    判断任务是否延迟执行可以使用wait_for
    std::future_status status = resultdeferred.wait_for(std::chrono::seconds(6));
    	//std::future_status status = result.wait_for(6s);
    	if (status == std::future_status::timeout) {
    		//超时:表示线程还没有执行完
    		cout << "超时了,线程还没有执行完" << endl;
    	}
    	else if (status == std::future_status::ready) {
    		//表示线程成功放回
    		cout << "线程执行成功,返回" << endl;
    		cout << resultdeferred.get() << endl;
    	}
    	else if (status == std::future_status::deferred) {
    		cout << "线程延迟执行" << endl;
    		cout << resultdeferred.get() << endl;
    	}
    
  2. std::packaged_task
    打包任务,把任务包装起来。它是类模板,它的模板参数是各种可调用对象,通过packaged_task把各种可调用对象包装起来,方便将来作为线程入口函数来调用。
    std::packaged_task<int(int)> myptpackaged_task(mythread);
    	std::thread t1(std::ref(myptpackaged_task), 1);
    	t1.join();
    	std::future<int> resultpackaged_task = myptpackaged_task.get_future();
    
  3. std::promise
    它也是类模板,我们能够在某个线程中给它赋值,然后我们可以在其他线程中对这个值进行修改之后再取出来。
    #include <thread>
    #include <iostream>
    #include <future>
    using namespace std;
    
    void mythread(std::promise<int>& tmp, int clac) {
    	cout << "mythread() start" << "threadid = " << std::this_thread::get_id() << endl;
    	std::chrono::milliseconds dura(5000);
    	std::this_thread::sleep_for(dura);
    	cout << "mythread() end" << "threadid = " << std::this_thread::get_id() << endl;
    	int result = clac+20;
    	tmp.set_value(result); //结果保存到了tmp这个对象中
    	return;
    }
    
    vector<std::packaged_task<int(int)>> task_vec;
    
    int main() {
    	std::promise<int> myprom;
    	std::thread t1(mythread, std::ref(myprom), 180);
    	t1.join(); //在这里线程已经执行完了
    	std::future<int> fu1 = myprom.get_future(); //promise和future绑定,用于获取线程返回值
    	auto result = fu1.get();
    	cout << "result = " << result << endl;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值