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

网站标题符号有哪些wordpress+软件+入门

网站标题符号有哪些,wordpress+软件+入门,百度站长网站地图,装修案例分析目录 什么是同步和异步#xff1f; future 使用future和async配合管理异步任务 使用promise和future配合管理异步任务 使⽤std::packaged_task和std::future配合 C11异步线程池 什么是同步和异步#xff1f; 同步#xff08;Synchronous#xff09; 同步编程是指程…目录 什么是同步和异步 future 使用future和async配合管理异步任务 使用promise和future配合管理异步任务 使⽤std::packaged_task和std::future配合 C11异步线程池 什么是同步和异步 同步Synchronous 同步编程是指程序按照代码的顺序一步步执行每一步必须等待上一步执行完毕才能执行下一步。在同步操作中如果某个任务如I/O操作、网络请求等需要等待比如等待磁盘读写完成、等待网络响应等程序就会阻塞在那里直到该任务完成才能继续执行后续的代码。这种方式简单直观但效率较低尤其是在处理需要长时间等待的任务时会导致程序响应变慢或“假死”。 异步Asynchronous 异步编程则允许程序在等待某个长时间运行的操作如文件I/O、网络请求等完成时继续执行后续的代码而不会阻塞当前线程。当异步操作完成时通常通过回调函数、Promises、Future、async/await等方式来通知程序以便执行后续依赖于该操作结果的操作。这种方式可以提高程序的效率和响应性尤其是在处理多个并发任务时。 future 介绍 std::future是C11标准库中的⼀个模板类它表⽰⼀个异步操作的结果。当我们在多线程编程中使⽤异步任务时std::future可以帮助我们在需要的时候获取任务的执⾏结果。std::future的⼀个重要特性是能够阻塞当前线程直到异步操作完成从⽽确保我们在获取结果时不会遇到未完成的操作。 简单来说future就是可以用来获取一个异步任务/函数的结果的 应用场景 异步任务 当我们需要在后台执⾏⼀些耗时操作时如⽹络请求或计算密集型任务等std::future可以⽤来表⽰这些异步任务的结果。通过将任务与主线程分离我们可以实现任务的并⾏处理从⽽提⾼程序的执⾏效率并发控制 在多线程编程中我们可能需要等待某些任务完成后才能继续执⾏其他操作。通过使⽤std::future我们可以实现线程之间的同步确保任务完成后再获取结果并继续执⾏后续操作结果获取std::future提供了⼀种安全的⽅式来获取异步任务的结果。我们可以使⽤std::future::get()函数来获取任务的结果此函数会阻塞当前线程直到异步操作完成。这样在调⽤get()函数时我们可以确保已经获取到了所需的结果 使用future和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 thread #include future #includechrono using namespace std; int Add(int num1, int num2) {cout 加法 endl;return num1 num2; } int main() {// 两个版本// 函数不定参数// 策略函数不定餐coutfirst endl;//deferred: 在执行get获取异步结果的时候才会执行异步任务//async: 内部会创建工作线程异步完成任务futureint result async(std::launch::deferred, Add, 11, 22);// 返回值是什么参数就是什么std::this_thread::sleep_for(chrono::seconds(1));couttwoendl;int sumresult.get();coutthreeendl;coutsumendl;return 0; } 使用promise和future配合管理异步任务 std::promise提供了⼀种设置值的⽅式它可以在设置之后通过相关联的std::future对象进⾏读取。换种说法就是之前说过std::future可以读取⼀个异步函数的返回值了 但是要等待就绪 ⽽std::promise就提供⼀种 ⽅式⼿动让 std::future就绪 我们可以把promise理解为主线程给另一个执行异步任务函数线程放返回值的篮子但是这个篮子交给另一个线程后无法在给回来因此主线程需要用promise创建一个future工具从这个篮子中去取返回值 #includeiostream #includethread #includefuture using namespace std; void Add(int num1,int num2,promiseint prom) {prom.set_value(num1num2);return ; } int main() {promiseint prom;futureint fuprom.get_future();thread t1(Add,11,22,ref(prom));int res fu.get();coutsum: resendl;t1.join();return 0; } 使⽤std::packaged_task和std::future配合 std::packaged_task就是将任务和 std::feature 绑定在⼀起的模板是⼀种对任务的封装。我们可以通过std::packaged_task对象获取任务相关联的std::feature对象通过调⽤get_future()⽅法获得。std::packaged_task的模板参数是函数签名。 可以把std::future和std::async看成是分开的 ⽽ std::packaged_task则是⼀个整体。 #includeiostream #includethread #includefuture #includememory using namespace std; //package_task是一个模板类实例化的对象可以对一个函数进行二次封装 int Add(int num1,int num2) {return num1num2; } int main() {auto ptask make_sharedpackaged_taskint(int,int)(Add);futureint fu ptask-get_future();thread thr([ptask](){(*ptask)(11,22);});int sum fu.get();coutsumendl;thr.join();return 0; } C11异步线程池 对于普通的线程池我们只是将任务交给线程执行即可但是如果我们想要获取任务执行的返回值就要进行类似上面的异步处理基于线程池执⾏任务的时候⼊⼝函数内部执⾏逻辑是固定的因此选择std::packaged_task加上std::future的组合来实现。 线程池工作思想 ⽤⼾传⼊要执⾏的函数以及需要处理的数据函数的参数,由线程池中的⼯作线程来执⾏函 数完成任务 实现 管理成员 任务池⽤vector维护的⼀个函数任务池⼦互斥锁 条件变量 实现同步互斥⼀定数量的⼯作线程⽤于不断从任务池取出任务执⾏任务结束运⾏标志以便于控制线程池的结束 管理的操作 ⼊队任务⼊队⼀个函数和参数停⽌运⾏终⽌线程池 完整代码 class threadpool { public: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();}void stop(){if (_stop true)return;_stop true;_cv.notify_all();// 等待所有线程退出for (auto thread : _threads){thread.join();}}// push传入的首先有一个函数// 不定参数表示要传入函数的参数// push函数内部会将这个传入的函数封装成一个异步任务抛入任务池中由工作线程取出执行// 使用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()(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;}private:// 线程入口函数// 不断地从任务池中取任务进行执行void entry(){while (!_stop){std::vectorFunctor tem_taskpool;{// 加锁std::unique_lockstd::mutex lock(_mutex);// 等待等待任务池不为空或者_stop被置位_cv.wait(lock, [this](){ return _stop || !_taskpool.empty(); });// 取出任务执行tem_taskpool.swap(_taskpool);}for (auto task : tem_taskpool){task();}}}private:std::atomicbool _stop;std::vectorFunctor _taskpool; // 任务池std::mutex _mutex;std::condition_variable _cv;std::vectorstd::thread _threads; // 线程池 }; 上面异步线程池的完整代码中的语法规则都是C11的新特性在核心功能中甚至一行都有好几个的C11新特性要想理解上面的代码需要我们非常熟悉新特性 今天对C11异步线程池的分享到这就结束了希望大家读完后有很大的收获也可以在评论区点评文章中的内容和分享自己的看法个人主页还有很多精彩的内容。您三连的支持就是我前进的动力感谢大家的支持!
http://www.w-s-a.com/news/285967/

相关文章:

  • h5网站开发用什么软件制作公司网站建设代理怎么做
  • 网站建设资料准备网上购物app有哪些
  • 沧州做网站优化哪家公司便宜国内百度云网站建设
  • 网站的最近浏览 怎么做龙岩市人才网最新招聘信息
  • 网站建设需要找工信部吗网站开发账务处理
  • 做那种的视频网站个体工商网站备案
  • 推广网官方推广网站中国建设招聘信息网站
  • 医院网站建设需要多少钱网络营销渠道可分为哪几种
  • 怎么取网页视频网站元素计算机专业论文网站开发
  • 上海网站建设备案号怎么恢复wordpress打开页面空白
  • 30个做设计的网站企业设计网站
  • 招生网站开发的背景创意 wordpress
  • 网站备案资料查询小型企业管理系统软件
  • 温州网站建设维护怎么做好网站开发、设计
  • 佛山 做网站公司有哪些网站排名忽然不见了
  • 广告网站建设最专业东莞大朗网站设计
  • 网站做流量的论坛贴吧分销商城系统源码
  • 新手建立网站的步骤网站建设费怎么入分录
  • 哪里建网站性价比高做网站赚取广告费
  • 邢台集团网站建设价格微信怎么做捐钱的网站
  • 做网站费用需要分摊吗装修公司一般多少钱一平方
  • 公司主页的网站格式wordpress自动推送给百度
  • 网站建设辶金手指排名十二wordpress 当数据库
  • 无锡手机网站建设服务苏州展厅设计企业
  • 无锡网站制作需要多少钱北京二次感染最新消息
  • 网站开发视频播放无画面杭州房产信息网官网
  • 网站开发 改进如何创建公众号平台
  • wordpress网站响应很慢只有asp网站代码可以重新编译吗
  • 哪个网站教做饭做的好wordpress热点文章
  • 可以做推广东西的网站重庆网站建设 重庆网站制作