博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++异步定时事件
阅读量:3576 次
发布时间:2019-05-20

本文共 1919 字,大约阅读时间需要 6 分钟。

异步std::async,std::future

C++标准库提供std::asyncstd::future,两个高级接口。

  • async() ,使一个callable object,在后台运行成为一个独立线程。
  • class future<> ,允许等待线程结束获取其返回结果(返回值也可能是一个异常)。
#include 
#include
#include
#include
#include
#include
#include
std::queue
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
lg(queueMutex); queue.push(value + i); } queueCondVar.notify_one(); //std::cout <
<<" finish!"<< std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 100));}void consumer(int num){ while(true){ int va; { std::unique_lock
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
l(cout); std::cout <<"consumer ID "<
<<" : "<< 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()时执行。

转载地址:http://jjxgj.baihongyu.com/

你可能感兴趣的文章
cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
查看>>
LeetCode 206反转链表 [javsScript]
查看>>
[LeetCode javaScript] 3. 无重复字符的最长子串
查看>>
[LeetCode javaScript] 6. Z字形变换
查看>>
[LeetCode javaScript]455. 分发饼干
查看>>
[LeetCode javaScript] 735. 行星碰撞
查看>>
[LeetCode javaScript] 125. 验证回文串
查看>>
[LeetCode javaScript] 226. 翻转二叉树
查看>>
[LeetCode javaScript] 520. 检测大写字母
查看>>
[LeetCode javaScript] 53.最大子序和
查看>>
[LeetCode javaScript] 101. 对称二叉树
查看>>
[LeetCode javaScript] 860. 柠檬水找零
查看>>
[LeetCode javaScript] 118. 杨辉三角
查看>>
[LeetCode javaScript] 905. 按奇偶校验排序数组
查看>>
[LeetCode javaScript] 617. 合并二叉树
查看>>
[LeetCode javaScript] 292. Nim游戏
查看>>
[LeetCode javaScript] 896. 单调数列
查看>>
[LeetCode javaScript] 804. 唯一摩尔斯密码词
查看>>
[LeetCode javaScript] 476. 数字的补数
查看>>
[LeetCode javaScript] 811. 子域名访问计数
查看>>