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

宣传旅游网站建设的重点是什么做网站知乎

宣传旅游网站建设的重点是什么,做网站知乎,企业即时通讯平台,网站建设执招标评分表目录 第一节:介绍 第二节:代码编写 第三节:测试 下期预告: 第一节:介绍 工作线程池的作用是缓存一些不着急完成的任务,这些任务由子线程来完成,以达到削峰填谷的作用。 在消息队列中&#x…

目录

第一节:介绍

第二节:代码编写

第三节:测试

下期预告:


第一节:介绍

        工作线程池的作用是缓存一些不着急完成的任务,这些任务由子线程来完成,以达到削峰填谷的作用。

        在消息队列中,客户端的信道发送请求时,会把请求抛入线程池,由子线程发送请求,主线程继续发送其他请求;服务器推送消息时,也会把推送任务抛入线程池,由子线程完成,主线程继续接受其它请求。

第二节:代码编写

        在mqcommon目录下添加名为mq_threadpool的文件,打开并防止重复包含、添加头文件、声明命名空间:

#ifndef __M_THREADPOOL_H__
#define __M_THREADPOOL_H__#include <iostream>
#include <functional>
#include <memory>
#include <thread>
#include <future>
#include <vector>
#include <condition_variable>namespace zd
{};#endif

        然后设置线程池要用的成员变量:

    class threadpool{private:// 函数类型:统一任务池的函数类型using Functor = std::function<void(void)>; // 无参数、返回值voidpublic:using ptr = std::shared_ptr<threadpool>; // 方便外部使用线程池的智能指针private:std::atomic<bool> _stop;            // 线程池状态std::mutex _mtx;                    // 互斥锁std::condition_variable _cv;        // 条件变量std::vector<Functor> _taskpool;     // 共享任务池std::vector<std::thread> _threads;  // 工作线程池};

        构造函数只需要传入该线程池的线程数量即可:

        // thr_count:工作线程的数量threadpool(size_t thr_count = 2):_stop(false){for(int i = 0;i < thr_count;i++){_threads.emplace_back(&threadpool::entry,this);}}

        设置一个私有成员函数entry(),它是每个线程的执行函数,功能是死循环的从任务池拉取任务去执行,然后设置一个条件变量,只有当 线程池销毁 或者 线程池有任务 时才让线程继续执行,否则线程一直阻塞:

        // 取出任务的函数// 每个工作线程初始化时传入的执行函数void entry(){// 创建一个线程私有任务池,用于向共享任务池获取任务std::vector<Functor> thr_taskpool;// 调用stop函数,_stop设置为true,子线程就可以执行完毕了while(!_stop){// 上锁std::unique_lock<std::mutex> lock(_mtx);// 解锁: 线程池销毁 || 有任务到来// 等待成功会自动上锁_cv.wait(lock,[this](){return _stop || !(_taskpool.empty());});// 该线程获得任务池的所有任务thr_taskpool.swap(_taskpool);// 解锁lock.unlock();// 该线程执行私有线程池的所有任务for(auto& task:thr_taskpool){task();}thr_taskpool.clear();}}

        设置一个对外的接口 stop(),它的作用是关闭这个线程池:

        // 终止线程池void stop(){   // 如果线程已经回收过了,则不需要再回收了if(_stop == true) return;_stop = true;     // 线程池标记为停止_cv.notify_all(); // 唤醒所有工作线程// 回收线程for(auto& thread:_threads){thread.join();}}

        然后析构函数对 stop 进行一个调用,目的是防止线程池对象销毁之前没有回收线程:

        ~threadpool(){// 如果忘记回收线程,析构函数自动回收stop();}

        最后是最重要的 push() 接口,它的作用是向线程池抛入一个外部任务:

// func:用户要执行的函数
// ...args:该函数的参数
// func会由push封装成异步任务——package_task,并使用lambda生成可调用对象,抛入任务池中,等待工作线程执行
// 执行完成后将future返回,供外部获取执行结果
template<class F,class ...Args>
auto push(F&& func,Args&& ...args) -> std::future<decltype(func(args...))>//->decltype(func(args...)):推导func的返回值类型,同步给push的返回值类型auto
{// 得到func的返回值类型using return_type = decltype(func(args...)); // 将func包装成无参函数——参数voidauto f = std::bind(std::forward<F>(func),std::forward<Args>(args)...); // 1.封装:函数->package_taskauto ptask = std::make_shared<std::packaged_task<return_type()>>(f);std::future<return_type> ft = ptask->get_future();// 2.封装:package_task->lambda——返回值void-无参数auto task_func = [ptask](){(*ptask)();};// 访问共享资源任务池,上锁_mtx.lock();// 3.将lambda抛入任务池_taskpool.push_back(task_func);// 解锁_mtx.unlock();// 4.唤醒一个工作线程去执行任务_cv.notify_one();return ft;
}

        这里解释一下,上述代码中的 ft 是一个存放了外部任务执行结果的结构体,类型是:

std::future<结果类型>,它也是一个模板,但是push又需要返回对应的结构体类型(即std::future<结果类型>)。

        所以使用 ->std::future<decltype(func(args...))> 。decltype(func(args...)) 推导出外部任务的返回值类型后,将返回值类型(例如int),组合成std::future<int>,并将其同步给push的返回类型auto。

        如果只使用 auto,它会因为所推到的类型过于复杂而报错。

第三节:测试

        在mqtest中新建文件mq_pool_test.cc,打开并添加头文件:

#include "../mqcommon/mq_threadpool.hpp"
#include "../mqcommon/mq_logger.hpp"

        然后设置一个加法任务,不断地抛入线程池,加法任务不仅要打印结果,还要打印执行这个任务的子线程id:

int Add(int n1,int n2)
{LOG("%ld:%d",pthread_self(),n1+n2);return n1+n2;
}int main()
{zd::threadpool thrpool(3);for(int i = 0;i < 20;i++){std::future<int> ft = thrpool.push(Add,11,i);std::this_thread::sleep_for(std::chrono::seconds(1)); // 主线程休眠1s}thrpool.stop();return 0;
}

        执行结果:

                ​​​​​​​        ​​​​​​​        

        可以看到3个子线程都执行过任务。

下期预告:

        所有的辅助代码都完成后,将进入虚拟机模块的实现,首先是交换机管理模块

http://www.dtcms.com/wzjs/796348.html

相关文章:

  • 网站建设人员叫什么资源网站建设活动感受
  • 营销型网站建设公司提供网站建设旅游微信网站建设
  • 清远市网站建设公司1元购类似网站架设药多少钱
  • 爱做网站站群系统程序
  • 织梦制作手机网站衡水企业网站制作报价
  • 深圳建设网站企业网站上图怎么用ps做
  • 免费个人业务网站制作不会编程怎么做网站
  • 免费推广网站视频域名连接到网站怎么做
  • c 写网站建设框架微商城网站开发制作
  • 如何设计公司官网站没备案的网站
  • 淘宝二官方网站是做啥的网站建设步骤 文档
  • 织梦网站程序5.7首页模板怎样在网站做环评公示
  • 我司网站改版上线网站建设搜狐快站生成app
  • 山东川畅信息技术有限公司网站建设lnmp和wordpress
  • 常州培训做网站小米路由器 做网站
  • 定制网站公司哪家好网站域名查询工具
  • 公司公共邮箱怎么申请优化公司组织结构
  • 怎么做返利网站包装纸箱公司怎么做网站
  • 网站设计制作费wordpress伪造ip
  • 域名交易的安全措施宁波seo关键词如何优化
  • 站长之家seo信息最好看免费中文
  • 石家庄专业网站设计网站建设界面ppt演示
  • 互联网如何做旅游网站网站会员系统怎么做模版
  • lamp网站开发黄金组合 pdf网站推广建设
  • 建立网站需要多长钱百度旗下13个app
  • 九江做网站开发需要多少钱制作一个软件
  • 课题组网站怎么做北京市网页设计
  • 网站都有什么语言模型下载网站开发流程图
  • 外网网站网站建设开发软件教程
  • 工商局网站做年报seo云优化软件