目录
1--std::async的使用
std::async用于启动一个异步任务,并返回一个std::future对象;std::future对象里含有异步任务线程入口函数的结果;
std::launch::deferred 表示调用线程入口函数将会被延迟到 std::future 的 wait() 或 get() 调用,当 wait() 或者 get() 没有被调用时,线程入口函数不会被调用(线程不会被创建);
#include <iostream>
#include <thread>
#include <mutex>
#include <future>
class Sample{
public:
// 线程入口函数
int thread(int value){
std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
std::chrono::microseconds dura(value); // rest
std::this_thread::sleep_for(dura);
return 5;
}
};
int main(int argc, char *argv[]){
Sample sample;
int value = 5000;
// std::async用于启动一个异步任务,并返回一个std::future对象
// std::future对象里含有异步任务线程入口函数的结果
std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
std::future<int> result = std::async(&Sample::thread, &sample, value);
// std::launch::deferred 表示调用线程入口函数将会被延迟到 std::future 的wait()或get()调用
// 当wait()或者get()没有被调用时,线程入口函数不会被调用(线程不会被创建)
// std::future<int> result = std::async(std::launch::deferred, &Sample::thread, &sample, value);
// result.get()等待thread()执行完毕获取结果后,主线程才继续往下执行
std::cout << "resule.get(): " << result.get() << std::endl;
// result.wait() // 等待线程返回,但不返回结果
std::cout << "main thread continue ..." << std::endl;
return 0;
}
2--std::packaged_task的使用
std::packaged_task 用于打包任务,其包装各种可调用对象,方便后续作为线程入口函数;
#include <iostream>
#include <thread>
#include <mutex>
#include <future>
// 线程入口函数
int thread(int value){
std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
std::chrono::microseconds dura(value); // rest
std::this_thread::sleep_for(dura);
return 5;
}
int main(int argc, char *argv[]){
// std::packaged_task 用于打包任务,其包装各种可调用对象,方便后续作为线程入口函数
std::cout << "thead id: " << std::this_thread::get_id() << std::endl;
std::packaged_task<int(int)> mypt(thread);
int value = 5000;
std::thread thread1(std::ref(mypt), value);
thread1.join();
std::future<int> result = mypt.get_future();
std::cout << "result.get(): " << result.get() << std::endl;
return 0;
}
3--std::promise的使用
std::promise 用于在其他线程中使用某个线程中的值;在下面的实例代码中,thread2 使用了 thread1 中的 result 值;
#include <iostream>
#include <thread>
#include <mutex>
#include <future>
// 线程入口函数
int thread(std::promise<int> &tmpp, int clac){
clac++;
clac *= 10;
std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
int result = clac;
tmpp.set_value(result);
return 0;
}
void thread_2(std::future<int> &tmpf){
auto result2 = tmpf.get();
std::cout << "tmpf.get(): " << result2 << std::endl;
}
int main(int argc, char *argv[]){
// std::promise 用于在某个线程中赋值,并在其他线程中将值取来用
std::cout << "thead id: " << std::this_thread::get_id() << std::endl;
std::promise<int> prom;
int clac = 1;
std::thread thread1(thread, std::ref(prom), clac);
thread1.join();
// 将promise中的值取来用
std::future<int> result = prom.get_future();
std::thread thread2(thread_2, std::ref(result));
thread2.join();
return 0;
}