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

重庆蒲公英网站建设公司设计师个人作品展示网站

重庆蒲公英网站建设公司,设计师个人作品展示网站,宁波易通建设网站,适合个人站长的网站有哪些TOC 介绍 std::future 是C11标准库中的一个模板类#xff0c;他表示一个异步操作的结果#xff0c;当我们在多线程编程中使用异步任务时#xff0c;std::future可以帮助我们在需要的时候#xff0c;获取任务的执行结果#xff0c;std::future 的一个重要特性是能…TOC 介绍         std::future 是C11标准库中的一个模板类他表示一个异步操作的结果当我们在多线程编程中使用异步任务时std::future可以帮助我们在需要的时候获取任务的执行结果std::future 的一个重要特性是能够阻塞当前线程直到异步操作完成从而确保我们在获取结果时不会遇到未完成的操作。 应用场景 异步任务当我们需要在后台执行一些耗时操作时如网络请求或计算密集型任务等std::future可以用来表示这些异步任务的结果通过将任务与主线程分离我们可以实现任务的并行操作从而提高程序的执行效率并发操作在多线程编程中我们可能需要等待某些任务完成后才能执行其他操作通过使用std::future,我们可以实现线程之间的同步确保任务完成后再获取结果并继续执行后续结果结果获取std::future提供了一种安全的方式来获取异步任务的结果。我们可以使用std::future::get()函数来获取任务的结果此函数会阻塞当前线程直到异步操作完成。这样在调用get()函数时我们可以确保已经获取到了所需的结果 使用方法 std::async std::async是一种将任务与std::future关联的简单方法它创建并运行一个异步任务并返回一个与该任务结果关联的std::future对象。默认情况下std::async是否启动了一个新的线程或者在等待future时任务是否同步运行取决于你给的参数这个参数为std::launch类型 std::launch::deferred 表明该函数会被延迟调用直到在future上调用get()或者wait()才会开始执行任务std::launch::async表明函数会在自己创建的线程上运行std::launch::deferred | std::launch::async 内部通过系统等条件自动选择策略 #include iostream #include future #include thread #include chronousing namespace std;int async_task() {std::this_thread::sleep_for(std::chrono::seconds(2));return 2; }int main() {// 关联异步任务async_task 和 futurestd::futureint result std::async(std::launch::deferred | std::launch::async, async_task);// 此时可以执行其他操作cout 干其他事情 endl;// 获取异步任务结果int ret result.get();cout ret endl;return 0; } std::packaged_task std::packaged_task就是将任务和std::future绑定在一起的模板是一种对任务的封装我们可以通过std::packaged_task对象获取任务相关联的std::future对象通过调用get_future()方法获取。std::packaged_task的模板参数是函数签名。 所谓函数签名就是一个函数头去掉函数名 下面介绍一下std::packaged_task首先这个类型的对象是不可复制的 可以看到拷贝构造函数被delete了。 std::packaged_task是用来包装异步任务的工具它的本质是将一个可调用对象封装起来和std::future结合起来这个不能被直接调用因为这样的实质是同步调用任务而不是异步调用并且std::packaged_task对象是没有返回值的因为是不可拷贝的 所以std::packaged_task对象在使用的时候需要创建一个线程然后使用智能指针或者move函数来进行传递。注意因为创建了一个新的线程并且需要获取到这个新的线程执行任务的结果所以我们就需要进行等待或者分离即join和detach()。 使用move进行移动 #include iostream #include future #include thread #include memory #include chronoint Add(int num1, int num2) {std::this_thread::sleep_for(std::chrono::seconds(2));return num1 num2; }int main() {std::packaged_taskint(int, int) task(Add);std::futureint fu task.get_future();std::thread th(std::move(task), 11, 22);int ret fu.get();std::cout ret std::endl;th.join();return 0; } 使用智能指针 #include iostream #include future #include thread #include memory #include chronoint Add(int num1, int num2) {std::this_thread::sleep_for(std::chrono::seconds(2));return num1 num2; }int main() {auto ptask std::make_sharedstd::packaged_taskint(int, int)(Add);std::futureint fu ptask-get_future();std::thread th([ptask](){(*ptask)(11, 22);});int ret fu.get();std::cout ret std::endl;th.join();return 0; } std::promise std::promise提供了一种设置值的方式它可以在设置之后通过相关联的std::future对象进行读取换种说法来说就是之前说过的std::future可以读取一个异步函数的返回值了但是要等待就绪而std::promise就提供了一个方式手动让std::future就绪 #include iostream #include future #include chronovoid task(std::promiseint result_promise) {int result 2;result_promise.set_value(result);std::cout result std::endl; }int main() {std::promiseint result;std::futureint reuslt_future result.get_future();std::thread th(task, std::move(result));int ret reuslt_future.get();std::cout ret std::endl;th.join();return 0; } 线程池设计 #include iostream #include functional #include memory #include thread #include future #include mutex #include condition_variable #include vectorclass threadPool { public:using ptr std::shared_ptrthreadPool;using Functor std::functionvoid(void);threadPool(int thr_count 1): _stop(false){for (int i 0; i thr_count; i){_threads.emplace_back(threadPool::entry, this);}}~threadPool(){stop();}// push传入的是首先有一个函数--用户要执行的函数接下来是不定参标识要处理的数据就是要传入到函数中的参数// push函数内部会将这个传入的函数封装成一个异步任务packaged_task// 使用 lambda 生成一个可调用对象内部执行异步程序抛入到任务池中由工作线程取出进行执行template typename F, typename ...Argsauto push(F func, Args ...args) - std::futuredecltype(func(args...)){// 1. 将传入的函数封装成一个packaged_task任务using return_type decltype(func(args...));auto tmp_func std::bind(std::forwardF(func), std::forwardArgs(args)...);//auto task std::make_sharedstd::packaged_taskreturn_type(std::forwardArgs(args)...)(std::forward(func));auto task std::make_sharedstd::packaged_taskreturn_type()(tmp_func);std::futurereturn_type fu task-get_future();// 2. 构造一个lambda 匿名函数捕获任务对象函数内执行任务对象{std::unique_lockstd::mutex lock(_mutex);// 3. 将构造出来的匿名函数抛入到任务池中_taskpool.push_back([task](){ (*task)(); });_cv.notify_one();}return fu;}void stop(){if(_stop true) return ;_stop true;_cv.notify_all();for (auto thread : _threads){thread.join();}}private:// 线程入口函数---内部不断的从任务池中取出任务进行执行void entry(){while (!_stop){std::vectorFunctor tmp_taskpool;{// 加锁std::unique_lockstd::mutex lock(_mutex);// 等待任务池不为空或者_stop 被置位返回true_cv.wait(lock, [this](){ return _stop || !_taskpool.empty(); });// 取出任务进行执行tmp_taskpool.swap(_taskpool); // 这里是将全局任务池里面的任务全部给一个线程里面的任务池 }for (auto task : tmp_taskpool){task();}}}private:std::atomicbool _stop;std::vectorFunctor _taskpool; // 任务池std::mutex _mutex; // 互斥锁std::condition_variable _cv; // 条件变量std::vectorstd::thread _threads; }; main函数 #include threadpool.hppint Add(int num1, int num2) {return num1 num2; }int main() {threadPool pool;for(int i 0; i 10; i){std::futureint fu pool.push(Add, 11, i);std::cout fu.get() std::endl;}pool.stop();return 0; }
http://www.hkea.cn/news/14368640/

相关文章:

  • 温州手机网站制作哪家好移动互联网开发作业
  • html5网站模板 站长网品牌型网站建设的好处
  • 网站网络安全怎么做怎么找到仿牌外贸出口公司的网站
  • 网站卖链接制作网站企业
  • 如何申请建设网站flash网站源码免费下载
  • 网站缓存实例wordpress添加导航页面
  • 韩国优秀网站设计欣赏网校课程
  • 企业网站建设 新闻宣传莱州网站建设有限公司
  • 广州seo网站推广费用做电商网站价格
  • 福建微网站建设公司推荐柑桔种植服务网站开发
  • 阿里云这么建设网站企业代理注册公司
  • 51ppt模板免费下载网站表单大师 做网站
  • 全总基层组织建设网站深圳荷坳网站建设公司
  • 湘潭seo长沙网站优化外包公司
  • 单位做网站有哪些做任务的兼职网站
  • 向国旗敬礼做时代新人网站山西推广型网站建设
  • 江苏赛孚建设工程有限公司网站百度极速版免费下载
  • 网站建设目的是什么广西网站建设培训
  • 寻找常州微信网站建设规划设计公司资质要求
  • 夏邑做网站橙光文字游戏制作工具
  • 哪些网站是做数据分析的昆明抖音推广公司
  • 山东查询网站备案网站流量用完了
  • 部门网站建设和维护广州市花都区网站建设公司
  • 网站建设规划方书模板如何免费建个人网站
  • 岳池做网站电话沈阳关键词快照优化
  • 论述网站建设及运营流程网站信任 用户转化
  • 绥化网站建设兼职拍摄制作宣传片企业
  • 甘肃省引洮工程建设管理局官方网站交易所网站开发
  • 如何做网站规范易语言做网站视频
  • wordpress音乐网站主题深圳十大集团公司排名