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

东莞网站建设服务商法国注册公司流程和费用

东莞网站建设服务商,法国注册公司流程和费用,中国建筑界网官网,如何用xshell安装wordpress目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5… 目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5.2 异常传播机制5.3 内存管理模型 四、 性能特征分析五、 扩展优化方向六、 典型问题排查指南七、 测试用例如果这篇文章对你有所帮助渴望获得你的一个点赞 一、线程池简介 线程池是一种并发编程技术通过预先创建一组线程并复用它们来执行多个任务避免了频繁创建和销毁线程的开销。它特别适合处理大量短生命周期任务的场景如服务器请求、并行计算。 线程池的核心组件 1. 任务队列Task Queue 存储待执行的任务通常是函数对象或可调用对象。 2. 工作线程Worker Threads 一组预先创建的线程不断从队列中取出任务并执行。 3. 同步机制 互斥锁Mutex保护任务队列的线程安全访问。 条件变量Condition Variable通知线程任务到达或线程池终止。 实现步骤 1. 初始化线程池 创建固定数量的线程每个线程循环等待任务。 2. 提交任务 将任务包装成函数对象加入任务队列。 3. 任务执行 工作线程从队列中取出任务并执行。 4. 终止线程池 发送停止信号等待所有线程完成当前任务后退出。 二、C11实现线程池 源码 #include vector #include queue #include future #include thread #include mutex #include condition_variable #include functional #include stdexceptclass ThreadPool { public://构造函数根据输入的线程数默认硬件并发数创建工作线程。//每个工作线程执行一个循环不断从任务队列中取出并执行任务。//explicit关键字防止隐式类型转换explicit ThreadPool(size_t threads std::thread::hardware_concurrency()): stop(false) {if (threads 0) {threads 1;}for (size_t i 0; i threads; i) {workers.emplace_back([this] {for (;;) {std::functionvoid() task;{std::unique_lockstd::mutex lock(this-queue_mutex);//等待条件线程通过条件变量等待任务到来或停止信号。(CPU使用率休眠时接近0%仅在任务到来时唤醒)//lambda表达式作为谓词当条件(停止信号为true 或 任务队列非空)为真时才会解除阻塞。this-condition.wait(lock, [this] {return (this-stop || !this-tasks.empty());});/* 传统忙等待while (!(stop || !tasks.empty())) {} // 空循环消耗CPU */if (this-stop this-tasks.empty()){//如果线程池需要终止且任务队列为空则直接returnreturn;}//任务提取从队列中取出任务并执行使用std::move避免拷贝开销。task std::move(this-tasks.front());this-tasks.pop();}//执行任务task();}});}}//任务提交enqueue方法templateclass F, class... Argsauto enqueue(F f, Args... args)- std::futuretypename std::result_ofF(Args...)::type {using return_type typename std::result_ofF(Args...)::type;//任务封装使用std::packaged_task包装用户任务支持异步返回结果。//智能指针管理shared_ptr确保任务对象的生命周期延续至执行完毕。//完美转发通过std::forward保持参数的左值/右值特性。auto task std::make_sharedstd::packaged_taskreturn_type()(std::bind(std::forwardF(f), std::forwardArgs(args)...));std::futurereturn_type res task-get_future();{std::unique_lockstd::mutex lock(queue_mutex);if (stop){throw std::runtime_error(enqueue on stopped ThreadPool);} tasks.emplace([task]() { (*task)(); });/* push传入的对象需要事先构造好再复制过去插入容器中而emplace则可以自己使用构造函数所需的参数构造出对象并直接插入容器中。emplace相比于push省去了复制的步骤则使用emplace会更加节省内存。*/}condition.notify_one();return res;}~ThreadPool() {//设置stop标志唤醒所有线程等待任务队列清空。{std::unique_lockstd::mutex lock(queue_mutex);stop true;}condition.notify_all();for (std::thread worker : workers){worker.join();}}private:std::vectorstd::thread workers; //存储工作线程对象std::queuestd::functionvoid() tasks; //任务队列存储待执行的任务std::mutex queue_mutex; //保护任务队列的互斥锁std::condition_variable condition; //线程间同步的条件变量bool stop; //线程池是否停止标志 };三、线程池源码解析 1. 成员变量 std::vectorstd::thread workers; // 工作线程容器 std::queuestd::functionvoid() tasks; // 任务队列 std::mutex queue_mutex; // 队列互斥锁 std::condition_variable condition; // 条件变量 bool stop; // 停机标志设计要点: 采用生产者-消费者模式任务队列作为共享资源 组合使用mutexcondition_variable实现线程同步 vector存储线程对象便于统一管理生命周期 2. 构造函数 2.1 线程初始化 explicit ThreadPool(size_t threads std::thread::hardware_concurrency()): stop(false) {if (threads 0) {threads 1;}for (size_t i 0; i threads; i) {workers.emplace_back([this] { /* 工作线程逻辑 */ });} }设计要点: explicit防止隐式类型转换如ThreadPool pool 4; 默认使用硬件并发线程数通过hardware_concurrency() 最少创建1个线程避免空池 使用emplace_back直接构造线程对象 2.2 工作线程逻辑 for (;;) {std::functionvoid() task;{std::unique_lockstd::mutex lock(queue_mutex);condition.wait(lock, [this] {return stop || !tasks.empty();});if (stop tasks.empty()) {return; }task std::move(tasks.front());tasks.pop();}task(); }核心机制: unique_lock配合条件变量实现自动锁管理 双重状态检查停机标志队列非空 任务提取使用移动语义避免拷贝 任务执行在锁作用域外进行 3. 任务提交(enqueue方法) 3.1 方法签名 templateclass F, class... Args auto enqueue(F f, Args... args)- std::futuretypename std::result_ofF(Args...)::type类型推导: 使用尾置返回类型声明std::result_of推导可调用对象的返回类型完美转发参数FArgs... 3.2 任务封装 auto task std::make_sharedstd::packaged_taskreturn_type()(std::bind(std::forwardF(f), std::forwardArgs(args)...));封装策略: packaged_task包装任务用于异步获取结果shared_ptr管理任务对象生命周期std::bind绑定参数注意C11的参数转发限制 3.3 任务入队 tasks.emplace([task]() { (*task)(); });优化点: 使用emplace直接构造队列元素Lambda捕获shared_ptr保持任务有效性显式解引用执行packaged_task 4. 析构函数 4.1 停机控制 ~ThreadPool() {{std::unique_lockstd::mutex lock(queue_mutex);stop true;}condition.notify_all();for (auto worker : workers){worker.join();} }停机协议: 设置停机标志原子操作广播唤醒所有等待线程等待所有工作线程退出 5. 关键技术点解析 5.1 完美转发实现 std::bind(std::forwardF(f), std::forwardArgs(args)...)保持参数的左右值特性支持移动语义参数的传递C11的限制无法完美转发所有参数类型 5.2 异常传播机制 任务异常通过future对象传播packaged_task自动捕获异常用户通过future.get()获取异常 5.3 内存管理模型 [任务提交者]|v[packaged_task] ---- shared_ptr ---- [任务队列]|v[future]三重生命周期保障 提交者持有future队列持有任务包装器工作线程执行任务 四、 性能特征分析 1. 时间复杂度 操作时间复杂度任务提交(enqueue)O(1)加锁开销任务提取O(1)线程唤醒取决于系统调度 2. 空间复杂度 组件空间占用线程栈每线程MB级任务队列与任务数成正比同步原语固定大小 五、 扩展优化方向 1. 任务窃取Work Stealing 实现多个任务队列空闲线程从其他队列窃取任务 2. 动态线程池 void adjust_workers(size_t new_size) {if (new_size workers.size()) {// 扩容逻辑} else {// 缩容逻辑} }3. 优先级队列 using Task std::pairint, std::functionvoid(); // 优先级任务std::priority_queueTask tasks;4. 无锁队列 moodycamel::ConcurrentQueuestd::functionvoid() tasks;六、 典型问题排查指南 现象可能原因解决方案任务未执行线程池提前析构延长线程池生命周期future.get()永久阻塞任务未提交/异常未处理检查任务提交路径CPU利用率100%忙等待或锁竞争优化任务粒度/使用无锁结构内存持续增长任务对象未正确释放检查智能指针使用 该实现完整展现了现代C线程池的核心设计范式开发者可根据具体需求在此基础进行功能扩展和性能优化。理解这个代码结构是掌握更高级并发模式的基础。 七、 测试用例 使用实例C11兼容 #include iostreamint main() {ThreadPool pool(4);// 提交普通函数auto future1 pool.enqueue([](int a, int b) {return a b;}, 2, 3);// 提交成员函数struct Calculator {int multiply(int a, int b) { return a * b; }} calc;auto future2 pool.enqueue(std::bind(Calculator::multiply, calc, std::placeholders::_1, std::placeholders::_2), 4, 5);// 异常处理示例auto future3 pool.enqueue([]() - int {throw std::runtime_error(example error);return 1;});std::cout 23 future1.get() std::endl;std::cout 4*5 future2.get() std::endl;try {future3.get();} catch(const std::exception e){std::cout Caught exception: e.what() std::endl;}return 0; }如果这篇文章对你有所帮助渴望获得你的一个点赞
http://www.w-s-a.com/news/654858/

相关文章:

  • 网站设计方面有什么公司运动鞋网站建设目的
  • 学校门户网站流程建设方案找人做网站 多少钱
  • 网站域名更换相应内容网站策划 要求
  • 百盛联合建设集团网站开发网站的步骤
  • php做网站评价网络公司经营范围可以加技
  • 网站积分的作用保定专业网站建设
  • 莆田做网站公司电话如何提升网站访问速度
  • 网站开发流程步骤 口袋网页访问wordpress
  • 湘潭做网站的公司自助建站教程
  • 做网站推广和头条推广wordpress 验证密码错误
  • 淘宝联盟网站怎么做深圳市创想三维科技有限公司
  • 校园网站建设招标公告php网站开发什么
  • 06628 网页制作与网站开发陕西省交通建设网站
  • 做wish如何利用数据网站暗红色网站
  • 企业 网站备案 法人长春建站模板搭建
  • 网站做快照网站改版 升级的目的
  • 自己做一个网站要多少钱海外推广什么意思
  • 郑州做网站哪家专业网络基础知识大全
  • 济南制作网站企业php 调试网站
  • 互联网站管理工作细则做网站通栏模糊
  • 徐州手机网站开发公司电话青岛有名的互联网公司
  • 如何在手机做网站wordpress 网站搬迁
  • 网站透明导航代码国外卖货平台有哪些
  • 张家界网站建设方案中国网页设计师
  • 淮南网站建设服务东莞营销型手机网站建设
  • 常德做网站专业公司河南高端网站建设
  • 网站服务器建设的三种方法会展设计ppt
  • 如何把自己做的网站放到内网seo优化网络
  • 北京网站建设net2006厦门优化公司
  • 制作网页前为什么要建立站点菏泽百度网站建设