voidtask(int a, int b, int& ret) { int ret_a = a * a; int ret_b = b * 2; std::unique_lock<std::mutex> lock(mtx); cv.notify_one(); ret = ret_a + ret_b; }
intmain() { int ret = 0; std::thread t(task, 1, 2, std::ref(ret));
std::unique_lock<std::mutex> lock(mtx); cv.wait(lock); std::cout << "return value is " << ret; t.join(); }
2. 解决方法
可以使用promise和future来组合完成线程同步的问题。
#include<iostream> #include<thread> #include<mutex> #include<condition_variable> #include<future> voidtask(int a, int b, std::promise<int>& ret) { int ret_a = a * a; int ret_b = b * 2; ret.set_value(ret_a + ret_b); }
intmain() { int ret = 0;
std::promise<int> p; std::future<int> f = p.get_future();
std::thread t(task, 1, 2, std::ref(p));
std::cout << "return value is " << f.get(); //阻塞等待,直到返回值 t.join(); }