c++11の异步方法 及线程间通信
1. std::promise 可以用来在线程间提供数据传递。
std::future = std::promise.get_future()。
线程中可以对promise赋值std::promise.set_value。
赋值之后std::future.get()就会返回其他线程中设置的值。
#include <iostream> #include <future> #include <chrono> std::promise<int> promis; int main(int argc, const char * argv[]) { std::future<int> fuResult = promis.get_future(); std::thread t([](){ std::this_thread::sleep_for(std::chrono::seconds(10)); promis.set_value(123); }); t.detach(); std::cout<<"detach..."<<std::endl; std::cout<<fuResult.get()<<std::endl; return 0; }
#include "stdafx.h" #include <iostream> #include <future> #include <chrono> #include <string> std::promise<std::string> promis; int main() { std::future<std::string> fuResult = promis.get_future(); auto t_cb=[]() { std::cout << "subThread start!"<<std::endl; std::chrono::milliseconds dur(10000); std::this_thread::sleep_for(dur); promis.set_value("value from subThread"); }; std::thread t(t_cb); t.detach(); std::cout << "detach..." << std::endl; std::cout << fuResult.get() << std::endl; getchar(); return 0; }
2. std::packaged_task 可以包裹一个函数, 有点类似std::function,不同之处在于这个可以通过get_future返回std::future对象来获取异步执行的函数结果。
#include "stdafx.h" #include <iostream> #include <future> #include <chrono> #include <string> int main() { std::packaged_task<int()> task([]() { std::cout << "packaged_task start!"<<std::endl; std::chrono::milliseconds dur(10000); std::this_thread::sleep_for(dur); return 10000; }); std::future<int> fuResult = task.get_future(); std::thread t_task(std::move(task)); t_task.detach(); std::cout << "detach..." << std::endl; std::cout << fuResult.get() << std::endl; getchar(); return 0; }
3. std::async提供异步执行的方法,std::future = std::async(...), 函数执行完成后可以通过std::future.get()获取到执行函数的返回值。
#include <iostream> #include <future> #include <chrono> int main(int argc, const char * argv[])
{ std::future<int> fuResult = std::async([]()
{ std::this_thread::sleep_for(std::chrono::seconds(10)); return 1; }); std::cout<<"detach..."<<std::endl; std::cout<<fuResult.get()<<std::endl; return 0; }