上篇中讲到,C++11的标准库提供了promise用于在线程执行的具体方法中返回数据,接收端通过future阻塞获取。这么做的前提是你可以修改方法的参数,或者说你需要写一个包装函数。想要让既有函数异步的话,你可以使用packaged_task类或者async方法。
具体分析之前,以下代码是在线程中需要执行的方法。
1 2 3 |
MyString some_function() { return MyString{"foo"}; } |
MyString是很早之前自己用来查看copy/move次数的类,不想用的话,可以替换为std::string。
packaged_task
packaged_task是一个封装了被调用的函数的task。注意,packaged_task本身并不提供异步执行的机制,所以你仍旧需要把packaged_task放到thread中去执行。
1 2 3 4 5 6 7 8 |
std::packaged_task<MyString()> task{some_function}; std::future<MyString> future = task.get_future(); std::thread task_thread{std::move(task)}; task_thread.join(); MyString string = future.get(); std::cout << string << std::endl; |
Continue reading “【C++11】异步执行之既有函数的包装:packaged_task类和async方法”