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

金融行业网站建设方案aso推广优化

金融行业网站建设方案,aso推广优化,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/509230/

相关文章:

  • 网站搭建教室企业网站开发实训心得
  • 阿克苏建设网站佛山app定制
  • 做淘宝网站要求与想法大型网站建设推荐
  • 在百度做网站赚钱吗跨境电商网站开发
  • 酒店网站建设策划方案南昌网站建设南昌
  • 临沂罗庄做网站房产cms
  • 五合一网站做优化好用吗网站设计的专业流程
  • 毕业设计论文网站开发需要多少网站seo建设方案
  • h5页面用什么做杭州优化外包哪里好
  • 许昌网站建设百姓国货app下载
  • 什么是建站装修公司做宣传在哪个网站
  • 阿里云虚拟主机多个网站吗大庆油田建设集团网站
  • 坂田公司做网站公司有网站域名后如何建网站
  • 自媒体网站程序淘宝网站维护
  • 凡科网站建设网站wordpress 七牛oss
  • 搬瓦工的主机可以用来做网站吗分类信息网站开发需求方案
  • 上海高端网站开发站霸网络国际网站建设的目的
  • 程序员招聘求职的网站做网站加入广告联盟
  • 网站建设的技术方案模板易做文学网站的logo
  • 建设国家标准官方网站响应式网站切图
  • 网站链接数怎么做wordpress安装网址
  • 沈阳建网站 哪家好如何做旅游网站推销
  • 继续网站建设南通网站建设方法
  • 淮南公司网站建设如果做京东优惠卷的网站
  • 二手房网站平台怎么做项目工程监理公司网站建设方案
  • 秦皇岛做网站公司小说推广平台有哪些
  • php网站做分享到朋友圈天元建设集团有限公司信用代码
  • 邱县做网站在线免费图片编辑器
  • 网站备份网站做网站如何把支付宝微信吧
  • 做网站的怎么获取客户信息晋城建设局网站