当前位置: 首页 > news >正文

商务酒店网站建设淮南网备案查询

商务酒店网站建设,淮南网备案查询,网上软文发稿平台,网站建设怎么推广std::future是用来接收一个线程的执行结果的#xff0c;并且是一次性的。 共享状态shared state future可以关联一个共享状态#xff0c;共享状态是用来储存要执行结果的。这个结果是async、promise、packaged_task设置的#xff0c;且这个结果只能设置一次。 创建future …std::future是用来接收一个线程的执行结果的并且是一次性的。 共享状态shared state future可以关联一个共享状态共享状态是用来储存要执行结果的。这个结果是async、promise、packaged_task设置的且这个结果只能设置一次。 创建future 创建future有四种方式 直接构造函数创建这种创建的future没用共享状态。 std::futureDataType future; 调用std::async返回一个future对象返回的future有共享状态。std::async是执行一个异步任务这个任务会放到线程池中的线程执行并通过future返回执行结果。通常异步任务优先考虑使用std::async而不是std::thread。 auto future std::async([]{return DataType{5}; }); std::cout future is Valid: future.valid() , async Result: future.get().n std::endl; 创建std::promise然后调用std::promise::get_future获取future对象返回的future有共享状态。promise可以设置一个值传递给future也可以设置一个异常传递给future。promise的set_value和set_exception 只能调用一次调第二次时会抛出异常。如果promise在析构前都未设置结果调用future::get获取结果会抛出异常。 {std::cout ------------- promise -----------------\n;std::promiseDataType promise;promise.set_value({5});// promise.set_value({6}); //set_value只能调用一次再次调用会抛出异常auto future promise.get_future();// auto future2 promise.get_future(); //get_future只能调用一次再次调用会抛出异常std::cout future is Valid: future.valid() , async Result: future.get().n std::endl;}{std::cout ------------- promise exception -----------------\n;std::promiseDataType promise;try {throw std::runtime_error(error);} catch (...) {// 如果调用了 promise.set_value 则不能调用 promise.set_exception // 否则 promise.set_exception 会抛出异常promise.set_exception(std::current_exception());}auto future promise.get_future();try {auto data future.get();std::cout future is Valid: future.valid() , async Result: data.n std::endl;} catch (const std::exception e) {std::cout e.what() std::endl;}}创建std::packaged_task然后调用get_futurestd::packaged_task::get_future获取future对象返回的future有共享状态。 std::cout ------------- packaged -----------------\n; std::packaged_taskDataType(int) task([](int a) {return DataType{a}; }); auto future task.get_future(); // auto future2 task.get_future(); //get_future只能调用一次再次调用会抛出异常 task(5); std::cout future is Valid: future.valid() , async Result: future.get().n std::endl; future状态 可以通过函数future::valid可以判断future是否有共享状态。如果有共享状态可以进一步通过函数future::wait_for(0s)来判读结果是否已经设置。wait_for有三个返回值 future_status::deferred 表示结果还未设置future_status::ready 表示结果已经设置future_status::timeout 表示超时 获取结果 通过future::get函数可以获取future的结果调用get函数需要注意以下几点 只有有共享状态的future才能获取结果如果没有共享状态会抛出异常。如果获取数据时future结果已经设置好则会立即返回。如果future状态还未设置好则会挂起线程一直等待直到结果被设置。如果相应async、promise、packaged_task到结束都一直未设置状态则会抛出异常。get函数只能调用一次调用完成后则会删除共享状态再次调用get函数会因为没有共享状态而抛出异常。 也可以调用waitwait_for, wait_until等带结果被设置。 多线程调用future 获取future结果时可以先判断future是否有共享状态然后再调用get函数获取结果代码如下 if (future.valid()){future.get();} 上面代码在单线程调用没有问题如果在线程同时调用则会有问题多个线程会同时判断future有共享状态因此同时有多个线程调用get函数而get函数只能被调用一次从而引发异常。 可以通过加锁解决这个问题但这并不是好的方法。更优雅的方法是通过future::share函数为每个线程创建一个std::shared_future。future调用完share将不再拥有共享状态如下 如果future本身没有共享状态调用share会生成一个没有共享状态的shared_future。 shared_future调用get函数时并不会清楚共享状态所以shared_future可以多次调用get函数。 示例代码 std::promiseDataType promise;auto future promise.get_future();auto shadedFuture future.share();std::cout future is valid: future.valid() std::endl;std::thread threads[4];for (int i 0; i 4; i){threads[i] std::thread([futureshadedFuture](int i){std::cout std::to_string(i) , future is Valid: std::to_string(future.valid()) , async Result: std::to_string(future.get().n) \n;}, i);}std::this_thread::sleep_for(std::chrono::milliseconds{100});promise.set_value({5});for (int i 0; i 4; i){threads[i].join();}std::cout std::endl; future析构阻塞 当future是由async创建的且future/shared_future是最后一个指向共享状态的future如果async还在执行则future在析构时会阻塞当前线程等待async执行完成。
http://www.zqtcl.cn/news/568446/

相关文章:

  • 桂林餐饮兼职网站建设如何在百度上建网站
  • 怎样做免费网站的推广便宜点的网站空间
  • 中国建设部网站失信名单自己做公司网站难吗
  • 济南做网站需要多少钱园区网站到底怎么建设
  • 武清做网站的公司wordpress商城
  • 网站建设的实训技术总结sql 新建网站
  • 开发网站多少钱网站文件目录结构
  • 网站规划和建设的步骤做网站用的各种图标大全
  • 网站公司查询js代码网站大全
  • 湘潭网站建设价格最新新闻热点事件100字
  • 音乐网站程序源码wordpress模板中文版
  • 网站建设计划表wordpress主题 大
  • 在手机制作网站书店网站建设技术风险
  • 爱站网域名查询wordpress自定义标题关键词描述
  • 西安学校网站建设报价建盏
  • 网页 网站 区别东莞手机app开发
  • 空压机网站开发公司广州海珠区有什么好玩的景点
  • 什么网站可以做期货企业解决方案服务协议
  • 西安汽车网站制作手机软件制作网站平台
  • 微信的微网站介绍自己的家乡遵义网站建设
  • 爱站seo东莞网站建设要注意什么
  • 惠州网站建设 英语6wordpress 表格提交
  • 做网站15年多少钱一度电
  • 北京网站域名快速备案外贸网站优化价格
  • 做网站 工资高吗免费建站的站点网站
  • 个人做营利性质网站会怎么样qq邮箱官方网站
  • 网站怎么做等级保护产品展示小程序
  • 奉贤网站建设专家高端自适应网站设计
  • 网站正在建设中 动态徐州网站建设方案咨询
  • 广东世纪达建设集团有限公司官方网站专业电商网站开发