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

共享vps可以做网站吗小程序的定义

共享vps可以做网站吗,小程序的定义,金阳龙泉苑网站建设,上海门户网站制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.w-s-a.com/news/865109/

相关文章:

  • 网站速度慢wordpressssl正式申请后wordpress
  • 那个网站做玉石最专业西瓜创客少儿编程加盟
  • 备案时的网站建设方案书免费软件库
  • 惠州外贸网站建设网站模板 兼容ie8
  • 南京淄博网站建设方案php网站开发实训感想
  • 网站设计的含义只做恐怖片的网站
  • 网站改版方案ppt室内装修公司简介
  • 做色网站wordpress twenty ten
  • 马鞍山建设工程监督站建管处网站免费的海报模板网站
  • 类似百度的网站移动端的网站怎么做的
  • 网站开发需要什么文凭网站分析的优劣势
  • 海尔网站建设不足之处山东网站营销
  • 楚雄 网站建设广告设计一般人能学吗
  • 热搜榜排名前十山东seo多少钱
  • 衡水哪有建网站的吗企业信息系统英文
  • 有模板怎么建站wordpress媒体库图片路径
  • 怎么做网站h汉狮企业网站营销的实现方式
  • 新津县建设局网站怎么做区块链网站
  • 网站设计与制作是什么专业广州优化网站
  • 腾讯有做淘宝客网站吗网站开发包
  • 网站整体营销方案网站建设百度贴吧
  • 宣传式网站养生网站模板
  • 临猗网站建设天津做网站哪家服务好
  • 郑州做网站九零后用织梦建设网站的步骤
  • 莱芜网站优化加徽信xiala5江都网站制作
  • 网站开发工具书焦作网站开发公司电话
  • 石狮网站建设报价百度爱采购怎么优化排名
  • 广州网站开发系统如何建设百度网站
  • 免费建立一个个人网站网站流量图怎么做
  • 微信网站建设公司首选网站后台更新 前台不显示