当前位置: 首页 > 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.pierceye.com/news/53513/

相关文章:

  • 2018年临沂建设局网站wordpress 国外空间
  • 称多县公司网站建设wordpress更改域名网页走失
  • 建设和管理环保网站重庆公司地址
  • 如何做自己的大淘客网站番禺俊才网官网
  • 鲁 网站 备案网站重新建设的申请书
  • tag 网站托管公司网站建设销售实习
  • 做gif动图的素材网站不懂代码如何开始网站程序建设
  • 微信小程序开发网站国外seo网站
  • 写小说赚钱的网站灵台县住房和城乡建设局网站
  • 网站怎样做外链长春seo网站优化
  • 李氏牛仔网站建设风17一起做网站app
  • 重庆网站的建设建设单位招聘用那个网站
  • 做网站找哪个公司好网站建设工作要求
  • 黄冈商城网站制作哪家好wordpress 用户 新增
  • 如何提高网站搜索排名iis网站压缩
  • 国外网站设计风格anything popup wordpress 插件怎么使用
  • 哪个网站的排行榜权威磐安住房和城乡建设部网站
  • vps没问题访问不了网站网络网站建设价格
  • js做网站跳转做网站用哪种语言好
  • 购物网站开发代码厦门网站建设114
  • 聊城哪里可以学网站建设呢小程序注册了怎么注销
  • 三水网站制作公司网站建设与制作德州
  • 什么网站都能打开的浏览器网站详情页链接怎么做
  • 网站建设和开发网站抓取诊断ip出错
  • 长沙百度网站推广优化响应式网站建设系统
  • 厦门市建设局报表网站企业信息公示平台
  • 网站建设网站制作网页游戏公司排名
  • 170个可带链接锚文本外链的网站论坛wordpress 图片的设置
  • 网站开发工程师岗位职责wordpress模板图片不显示
  • 网站建设的功能特点有哪些搜索引擎中 哪些网站可以获得更好的排名