1--std::future_status的使用
std::future_status成员函数含有三种状态:timeout(执行超时)、ready(执行完毕)和deferred(延迟执行),其中 deferred 状态需要用 std::launch::deferred 对线程进行设置,使其延迟直到 get() 或者 wait() 被调用;
#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::seconds dura(value); // rest
std::this_thread::sleep_for(dura);
return 5;
}
};
int main(int argc, char *argv[]){
Sample sample;
int value = 5;
std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
std::future<int> result = std::async(&Sample::thread, &sample, value);
// 等待1s
std::future_status status = result.wait_for(std::chrono::seconds(1));
if (status == std::future_status::timeout){ // 超时,因为线程里面睡眠了5s
// if判断为true,表明线程还没执行完,超时了
std::cout << "thread timeout!" << std::endl;
}
else if(status == std::future_status::ready){ // 线程在等待期间成功返回
std::cout << "result.get(): " << result.get() << std::endl;
}
// std::launch::deferred设置延迟执行状态
// std::future<int> result = std::async(std::launch::deferred, &Sample::thread, &sample, value);
else if(status == std::future_status::deferred){ // 延迟执行状态
std::cout << "deferred, result.get(): " << result.get() << std::endl;
}
std::cout << "main thread continue ..." << std::endl;
return 0;
}
2--std::shared_future的使用
由于 std::future 对象只能被 get() 一次(get()的实现基于移动语义),当多个线程都需要 std::future 对象 get() 的结果时,就会出错;
std::shared_future 对象可以很好地解决上述问题;
#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::seconds 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 = 5;
std::thread thread1(std::ref(mypt), value);
thread1.join();
// std::future<int> result = mypt.get_future(); // std::future对象
std::shared_future<int> share_result(mypt.get_future()); // std::shared_future对象
// 可以多次调用
std::cout << "result.get(): " << share_result.get() << std::endl;
std::cout << "result.get(): " << share_result.get() << std::endl;
return 0;
}
3--std::atomic的使用
主要思路: