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

中国建设规划采购网站wordpress添加视频插件

中国建设规划采购网站,wordpress添加视频插件,网站安全备案,页面 访问 每天 正常 欢迎目录 std::future 介绍 应用场景 用法示例 使用 std::async 关联异步任务 使用 std::packaged_task 和 std::future 配合 使用 std::promise 和 std::future 配合 c11 线程池实现 std::future 介绍 std::future 是 C11 标准库中的一个模板类,它表示一个异步操作…

目录

std::future

介绍

应用场景

 用法示例

使用 std::async 关联异步任务

 使用 std::packaged_task 和 std::future 配合

 使用 std::promise 和 std::future 配合

c++11 线程池实现


std::future

介绍

         std::future 是 C++11 标准库中的一个模板类,它表示一个异步操作的结果。当我们在多线程编程中使用异步任务时,std::future 可以帮助我们在需要的时候获取任务的执行结果。std::future 的一个重要特性是能够阻塞当前线程,直到异步操作完成,从而确保我们在获取结果时不会遇到未完成的操作。  

应用场景

  1. 异步任务: 当我们需要在后台执行一些耗时操作时,如网络请求或计算密集型任务等,std::future 可以用来表示这些异步任务的结果。通过将任务与主线程分离,我们可以实现任务的并行处理,从而提高程序的执行效率。
  2. 并发控制: 在多线程编程中,我们可能需要等待某些任务完成后才能继续执行其他操作。通过使用 std::future,我们可以实现线程之间的同步,确保任务完成后再获取结果并继续执行后续操作。
  3. 结果获取:std::future 提供了一种安全的方式来获取异步任务的结果。我们可以使用 std::future::get()函数来获取任务的结果,此函数会阻塞当前线程,直到异步操作完成。这样,在调用 get()函数时,我们可以确保已经获取到了所需的结果。

 用法示例

使用 std::async 关联异步任务

        std::async 是一种将任务与 std::future 关联的简单方法。它创建并运行一个异步任务,并返回一个与该任务结果关联的 std::future 对象。默认情况下,std::async 是否启动一个新线程,或者在等待 future 时,任务是否同步运行都取决于你给的 参数。这个参数为 std::launch 类型:

  1. ○ std::launch::deferred 表明该函数会被延迟调用,直到在 future 上调用 get()或者 wait()才会开始执行任务。
  2. std::launch::async 表明函数会在自己创建的线程上运行。
  3. std::launch::deferred | std::launch::async 内部通过系统等条件自动选择策略。

deferred策略:

#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>int add(int num1, int num2)
{std::cout << "加法:" << num1+num2 << std::endl;return num1+num2;
}int main()
{std::cout << "------------------------1---------------------------" << std::endl;// std::launch::deferred: 调用get才会执行加法函数std::future<int> result = std::async(std::launch::deferred, add, 11, 22);// std::future<int> result = std::async(std::launch::async, add, 11, 22);sleep(1);std::cout << "------------------------2---------------------------" << std::endl;int sum = result.get(); std::cout << sum << std::endl;return 0;
}

运行结果:

 async策略:

#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>int add(int num1, int num2)
{std::cout << "加法:" << num1+num2 << std::endl;return num1+num2;
}int main()
{std::cout << "------------------------1---------------------------" << std::endl;// std::launch::deferred: 调用get才会执行加法函数// std::future<int> result = std::async(std::launch::deferred, add, 11, 22);std::future<int> result = std::async(std::launch::async, add, 11, 22);sleep(1);std::cout << "------------------------2---------------------------" << std::endl;int sum = result.get(); std::cout << sum << std::endl;return 0;
}

运行结果:

 使用 std::packaged_task 和 std::future 配合

        std::packaged_task 就是将任务和 std::future 绑定在一起的模板,是一种对任务的封装。我们可以通过 std::packaged_task 对象获取任务相关联的 std::future 对象,通过调用 get_future()方法获得。std::packaged_task 的模板参数是函数签名。

        可以把 std::future 和 std::async 看成是分开的, 而 std::packaged_task 则是一个整体。

演示demo:

#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>
#include <memory>int add(int num1, int num2)
{sleep(1);return num1+num2;
}int main()
{std::packaged_task<int(int, int)> pt(add);// pt 可以看做是一个可调用对象, 但不能作为一个完全的函数来使用std::future<int> fu = pt.get_future();pt(11, 22);int result = fu.get();std::cout << result << std::endl;return 0;
}

运行结果:

异步执行 std::packaged_task 任务:

#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>
#include <memory>int add(int num1, int num2)
{sleep(1);return num1+num2;
}int main()
{// pt虽然重载了()运算符,但pt并不是一个函数,所以导致它作为线程的入口函数时,语法上看没有问题,但是实际编译的时候会报错// 而 packaged_task 禁止了拷贝构造,// 且因为每个 packaged_task 所封装的函数签名都有可能不同,因此也无法当作参数一样传递// 传引用不可取,毕竟任务在多线程下执行存在局部变量声明周期的问题,因此不能传引用// 因此想要将一个 packaged_task 进行异步调用,// 简单方法就只能是 new packaged_task,封装函数传地址进行解引用调用// 而类型不同的问题,在使用的时候可以使用类型推导来解决// 将pt定义为一个智能指针auto ptask = std::make_shared<std::packaged_task<int(int, int)>>(add);std::future<int> fu = ptask->get_future();std::thread th([ptask](){(*ptask)(11, 22);});int result = fu.get();std::cout << result << std::endl;th.join();return 0;
}

运行结果:

 使用 std::promise 和 std::future 配合

        std::promise 提供了一种设置值的方式,它可以在设置之后通过相关联的 std::future 对象进行读取。换种说法就是之前说过 std::future 可以读取一个异步函数的返回值了, 但是要等待就绪,而 std::promise 就提供一种 方式手动让 std::future 就绪。

#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>void add(int num1, int num2, std::promise<int> &prom)
{sleep(1);prom.set_value(num1+num2);return;
}int main()
{std::promise<int> prom;std::future<int> fu = prom.get_future();std::thread th(add, 11, 22, std::ref(prom));int result = fu.get();std::cout << result << std::endl;th.join();return 0;
}

运行结果:

c++11 线程池实现

        基于线程池执行任务的时候,入口函数内部执行逻辑是固定的,因此选择std::packaged_task 加上std::future 的组合来实现。

线程池的工作思想:
        用户传入要执行的函数,以及需要处理的数据(函数的参数),由线程池中的
工作线程来执行函数完成任务

实现:

  • 管理的成员
  1. 任务池:用 vector 维护的一个函数任务池子▪ 互斥锁 & 条件变量: 实现同步互斥
  2. 一定数量的工作线程:用于不断从任务池取出任务执行任务▪ 结束运行标志:以便于控制线程池的结束。
  • 管理的操作:
  1. 入队任务:入队一个函数和参数
  2. 停止运行:终止线程池
#include <iostream>
#include <thread>
#include <functional>
#include <mutex>
#include <condition_variable>
#include <future>
#include <memory>
#include <vector>
#include <atomic>class ThreadPool
{
public:using Func = std::function<void(void)>;ThreadPool(int thread_num = 1):_stop(false){for (int i = 0; i < thread_num; i++){_threads.emplace_back(&ThreadPool::entry, this);}}~ThreadPool(){stop();}template <class F, class ...Args>auto push(F &&func, Args &&...args) -> std::future<decltype(func(args...))>{using return_type = decltype(func(args...));// 由于不确定参数,就先绑定进函数auto Func = std::bind(std::forward<F>(func), std::forward<Args>(args)...);// 利用智能指针管理一个new出来的packaged_task对象auto task = std::make_shared<std::packaged_task<return_type()>>(Func);std::future<return_type> fu = task->get_future();{// 推入任务池std::unique_lock<std::mutex> lock(_mutex);_tasks.emplace_back([task](){(*task)();});_cv.notify_one();}return fu;}void stop() {if(_stop) return;_stop = true;_cv.notify_all();for (auto &thread : _threads){thread.join();}}private:void entry(){while(!_stop){std::vector<Func> tmp_tasks;{// 加锁std::unique_lock<std::mutex> lock(_mutex);// 等待任务池不为空或线程池停止_cv.wait(lock, [this](){return !_tasks.empty() || _stop;});// 取出任务tmp_tasks.swap(_tasks);}// 执行任务for (auto &task : tmp_tasks){task();}}}private:std::mutex _mutex;std::condition_variable _cv;std::vector<std::thread> _threads;std::vector<Func> _tasks;std::atomic<bool> _stop;
};


文章转载自:

http://FusCWFla.LznfL.cn
http://acUYtzJe.LznfL.cn
http://v6x6Zr3Z.LznfL.cn
http://Bxz9FxkP.LznfL.cn
http://Fcj1Sjzt.LznfL.cn
http://66VQoTs8.LznfL.cn
http://yyishIec.LznfL.cn
http://2rdY3F0v.LznfL.cn
http://zQuq8mjy.LznfL.cn
http://wTTM9pCs.LznfL.cn
http://QUWURDFQ.LznfL.cn
http://OM83UnGJ.LznfL.cn
http://n8SjLCBs.LznfL.cn
http://3xqauWAm.LznfL.cn
http://cMXy9TAM.LznfL.cn
http://GAS07w9R.LznfL.cn
http://Zk2goGsk.LznfL.cn
http://v4JVkwgq.LznfL.cn
http://3U1933g9.LznfL.cn
http://m4MBmAun.LznfL.cn
http://N2lW2Dh2.LznfL.cn
http://gmqCzPv2.LznfL.cn
http://ETPo4NWj.LznfL.cn
http://ClCnsk57.LznfL.cn
http://ZKxYyfxS.LznfL.cn
http://S5p95FKe.LznfL.cn
http://CNDxEgLg.LznfL.cn
http://xFVMJSeU.LznfL.cn
http://qJbYPHmw.LznfL.cn
http://5tXUXNXu.LznfL.cn
http://www.dtcms.com/wzjs/648569.html

相关文章:

  • 网络公司网站开发案例外国网站快速申请qq
  • 湖北网站建设路公司彩页设计制作
  • 网站建设的用户名和密码代码南昌seo站外优化
  • 网站服务器备案查询网站做网站页面遇到的问题
  • 站长音效早期网页游戏
  • 自学建立网站常见cms网站源码下载
  • 网站内怎么做链接虚拟币交易网站建设
  • 怎么做网站信任网站建设 图纸网
  • 最好最值得做的调查网站chrome官网
  • 专业营销的网站建设公司哪家好静态网页托管
  • 东莞网站建设 织梦什么是企业文化
  • 自己做的网站出现iis7常见制作网页的软件
  • 网站用品推广网页wordpress 热门主题
  • 网站开发简历 自我评价建网站书籍
  • 青岛专用网站制作wordpress后台打开时间长
  • 建设英文网站0元代理注册公司
  • 网站开发维护员挣钱吗高端品牌型网站建设
  • wordpress如何导航网站零基础学室内设计需要多久
  • 小型网站怎样优化wordpress安全插件对比
  • 画册排版电商网站如何做seo
  • 电子商务网站建设代码新网站 不稳定
  • 新浪网页版河南网站seo地址
  • 如何获取网站备案号公司做网络推广哪个网站好
  • 机械加工网站哪个好广东网站建设网
  • 石家庄网站建设哪里好整合营销什么意思
  • 建设银行官方网站-云服务广州天河区最新情况
  • 湖北省建设信息网站吴江建设局网站打不开
  • 网站建设与维护试题含答案网站后台模板 仿cnzz
  • 网站推广运营免费按模板制作微网站
  • wordpress的网站后台最有效的15个营销方法