异步std::async,std::future
C++标准库提供std::async ,std::future,两个高级接口。
- async() ,使一个callable object,在后台运行成为一个独立线程。
- class future<> ,允许等待线程结束获取其返回结果(返回值也可能是一个异常)。
#include <iostream>
#include <mutex>
#include <future>
#include <mutex>
#include <iostream>
#include <chrono>
#include <queue>
std::queue<int> queue;
std::mutex queueMutex;
std::mutex cout;
std::condition_variable queueCondVar;
void provider(int value){
for(int i = 0; i < 10; ++i){
std::lock_guard<std::mutex> lg(queueMutex);
queue.push(value + i);
}
queueCondVar.notify_one();
//std::cout <<std::this_thread::get_id()<<" finish!"<< std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 100));
}
void consumer(int num){
while(true){
int va;
{
std::unique_lock<std::mutex> ul(queueMutex);
auto st = queueCondVar.wait_for(ul,std::chrono::seconds(2),[]{return !queue.empty();});
if(queue.empty()){ //此时为false,说明了使用等待时间到了,而并非是返回值返回true
std::cout <<"program stop or queue is empty!"<< std::endl;
break;
}
//if(std::cv_status::no_timeout == st){
va = queue.front();
queue.pop();
//}
}
std::lock_guard<std::mutex> l(cout);
std::cout <<"consumer ID "<<num<<" : "<< va << std::endl;
}
}
int main(){
auto p1 = std::async(std::launch::async,provider,1000);
auto p2 = std::async(std::launch::async,provider,2000);
auto p3 = std::async(std::launch::async,provider,1500);
auto p4 = std::async(std::launch::async,provider,2500);
auto c1 = std::async(std::launch::async,consumer,1);
auto c2 = std::async(std::launch::async,consumer,2);
auto c3 = std::async(std::launch::async,consumer,3);
auto c4 = std::async(std::launch::async,consumer,4);
auto c5 = std::async(std::launch::async,consumer,5);
auto c6 = std::async(std::launch::async,consumer,6);
auto c7 = std::async(std::launch::async,consumer,7);
}
wait(),get()可以强制启动线程并等待线程执行完成,`一个std::future<>get()
只能调一次,在这之后future处于无效状态,这种状态可以用valid()检测,wait_for()以及until_for()可以设置等待时间。
std::async 可以设置启动线程的策略,std::launch::async会立即执行,std::launch::deferred会延迟在,get(),wait()时执行。