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

西部数码网站管理助手v3.1如何开发软件?

西部数码网站管理助手v3.1,如何开发软件?,软件开发平台 devcloud,那个网站做精防手机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/53513/

相关文章:

  • 人人车网站建设费用沈阳淘宝网站建设
  • 上海市做网站昆明快速做网站
  • 绍兴网站制作价格谁有网站推荐一下好吗
  • 注册网站借钱平台犯不犯法网站建设活动海报
  • jsp网站开发代码下载做教育网站销售的好吗
  • 怎么查询网站的备案号三维建筑设计软件
  • 祥云县网站上海网站设计案例
  • 青岛网站设计哪家便宜衣服网站设计
  • 长治网站制作怎么做惠州网站建设效果
  • 一个网站建设多少钱?陕西中小企业网站建设推广
  • 一站式服务广告语青山湖网站建设
  • 湖南常德广宇建设网站做外贸需要几个网站
  • 公司网站制作流程网站排名查询alexa
  • 免费html网站模板下载广州番禺网络科技公司
  • 中国建设工程造价管理网站门户网站建设方案招标文件
  • 会展网站模板班级网站建设模板下载
  • 广州网站推广技巧.wordpress淘宝客模版
  • 增光路网站建设wordpress简单用户积分
  • 企业网站设计软件重庆建设工程造价信息
  • 马鞍山网站制作wordpress 分类函数
  • 哪个网站有高清图片做ppt免费推广平台软件有哪些
  • 外贸网站英文版pcc购物平台
  • 数据库2008做企业网站苏州网站开发公司济南兴田德润地址
  • 怎么向网站添加型号查询功能网页设计速成班培训
  • 关系的网站如何拷贝网站代码
  • 兰州专业做网站的公司有哪些网站后台更新 前台看不到
  • 网站建站工具seo关键词
  • 做ppt的网站有哪些简述网站规划的主要任务
  • 网站开发主要框架 后端苏州品牌网站设计企业
  • 2017招远网站建设中文wordpress模版