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

工具网站有哪些有做义工的相亲网站吗

工具网站有哪些,有做义工的相亲网站吗,电子商城采购平台官网,简单大气网站模板概要 通常线程池是同质的#xff0c;每个线程都可以执行任意的task#xff08;每个线程中的task顺序执行#xff09;#xff0c;如下图所示#xff1a; 但本文所介绍的线程和task之间有绑定关系#xff0c;如A task只能跑在A thread上#xff08;因此称为异构线程池每个线程都可以执行任意的task每个线程中的task顺序执行如下图所示 但本文所介绍的线程和task之间有绑定关系如A task只能跑在A thread上因此称为异构线程池每个线程的功能是有所区别的如下图所示 接口设计 TThreadPool接口设计 // 线程池 class TThreadPool { public:TThreadPool() {}TThreadPool(const TThreadPool) delete;TThreadPool operator(const TThreadPool other) delete;~TThreadPool();bool add_thread(std::string name); // add one thread into poolbool delete_thread(std::string name); // remove one thread from poolTThread* get_thread_by_name(std::string threadname); // get the thread by name, dont delete return object by yourselfbool append_task_by_thread(const std::string threadname, const std::functionvoid() task); // add task to pointed threadprivate:std::mutex m_mutex;std::mapstd::string, TThread* m_threads; }; TThreadPool类的主要功能是管理创建的线程TThread它是线程的具体实现它提供了增加/删除线程的接口同时给每个线程打上了标签name。 TThread接口设计 // 对std::thread的封装类 class TThread { public:TThread(std::string name);TThread(const TThread other) delete;TThread operator(const TThread other) delete;~TThread();bool push_task(const std::functionvoid() task); // one add taskstd::thread::id get_thread_id(); // for log purposevoid set_max_task_size(int s); // avoid thread too busyint get_task_size(); // get current task numberprivate:void work(); // real work threadvoid notify(); // notify work thread to quit private:std::string s_name;std::atomic_bool b_running;std::thread* p_thread;std::mutex m_mutex;std::queuestd::functionvoid() m_tasks;std::condition_variable m_cond;std::atomicint i_maxTaskSize; }; TThread类的主要功能是分配任务push_task函数和处理任务work函数。 代码实现 TThreadPool类 TThreadPool::~TThreadPool() {std::unique_lockstd::mutex lk(m_mutex);for(auto iterm_threads.begin(); iter!m_threads.end(); iter) {if(iter-second ! nullptr) {delete iter-second;}}m_threads.clear(); }bool TThreadPool::add_thread(std::string name) {std::unique_lockstd::mutex lk(m_mutex);if(m_threads.count(name)) {return false;}auto tt new TThread(name);if(tt nullptr) {return false;}m_threads[name] tt;return true; }bool TThreadPool::delete_thread(std::string name) {std::unique_lockstd::mutex lk(m_mutex);if(m_threads.count(name) 0) {return false;}delete m_threads[name];m_threads.erase(name);return true; }TThread* TThreadPool::get_thread_by_name(std::string threadname) {std::unique_lockstd::mutex lk(m_mutex);if(m_threads.count(threadname) 0) {return nullptr;}return m_threads[threadname]; }bool TThreadPool::append_task_by_thread(const std::string threadname, const std::functionvoid() task) {std::unique_lockstd::mutex lk(m_mutex);if(m_threads.count(threadname) 0) {return false;}auto tt m_threads[threadname];return tt-push_task(task); }TThread类 const int MAX_TASK_SIZE 100; // max task size in one threadTThread::TThread(std::string name) : s_name(name), b_running(true), i_maxTaskSize(MAX_TASK_SIZE) {p_thread new std::thread(TThread::work, this); }TThread::~TThread() {notify(); // notify work thread quitif(p_thread-joinable()) {p_thread-join();}delete p_thread; }bool TThread::push_task(const std::functionvoid() task) {std::unique_lockstd::mutex lk(m_mutex);if(!b_running) {return false;}if(m_tasks.size() i_maxTaskSize.load()) {return false;}m_tasks.push(task);m_cond.notify_one();return true; }std::thread::id TThread::get_thread_id() {return p_thread-get_id(); }void TThread::set_max_task_size(int s) {if(s 0) {return;}i_maxTaskSize.store(s); }void TThread::work() {std::cout std::this_thread::get_id() begin work thread std::endl;while (b_running) { // quit even tasks remainingstd::functionvoid() task;{std::unique_lockstd::mutex lk(m_mutex);if (!m_tasks.empty()) {task m_tasks.front();m_tasks.pop();} else if (b_running m_tasks.empty()) {m_cond.wait(lk);}}if (task)task(); // do the task}std::cout std::this_thread::get_id() end work thread std::endl; }void TThread::notify() {std::unique_lockstd::mutex lk(m_mutex);b_running false;m_cond.notify_one(); // mutex will be released here, therefore another thread would lock it afterward }int TThread::get_task_size() {std::unique_lockstd::mutex lk(m_mutex);return m_tasks.size(); } 使用方式 有两种方式可以调用对应的线程 公共代码 void func1(int i) {std::cout into func1: i std::endl;sleep(2); // simulate real work }TThreadPool thread_pool;thread_pool.add_thread(vdr); // 启动vdr线程thread_pool.add_thread(xgb); // 启动xgb线程 方式一、(先获取线程对象然后对该线程对象添加任务) auto tt thread_pool.getThreadByName(vdr); tt-push_task(std::bind(func1, 2)); tt-push_task(std::bind(func1, 5)); 方式二、直接通过线程池给对应线程添加任务 thread_pool.append_task_by_thread(vdr, std::bind(func1, 2)); thread_pool.append_task_by_thread(vdr, std::bind(func1, 5)); 注 task是std::functionvoid()类型上面的demo是普通函数实现的真实场景应该是类函数实现如下 class A { public:void func(std::string str) {std::cout into A func: str std::endl;} };A a;thread_pool.append_task_by_thread(vdr, std::bind(A::func, a, 2));thread_pool.append_task_by_thread(vdr, std::bind(A::func, a, 5));
http://wiki.neutronadmin.com/news/288297/

相关文章:

  • 为什么网站建设需要每年续费介绍企业的ppt
  • 沈阳学网站制作学校宜兴城乡建设局网站
  • 谎称在网站网站做维护如何帮公司做网站
  • 自己做网站需要学什么可以做英语阅读理解的网站
  • 自建站多少钱推广网店店铺
  • 东莞如何编写网站建设编程网站入口
  • 青岛做网站建设的公司排名浙江网站建设公司
  • 重庆网站建设及优化专业做卖菜的网站
  • 网站建设网络推广方案ppt福田公司总部
  • 门户网站建设自查整改报告网站建设添加视频
  • 安微网站建设动画设计招聘信息
  • 东莞市住房和城乡建设局门户网站漳州市建设局网站6
  • 常州网站建设公司好么学编程去哪里学比较好
  • 北京网站域名备案山东舜玉建设工程有限公司网站
  • 建设网站技术人员先进事迹怎么制作自己的小程序
  • 做网站空wordpress去index.php
  • 深圳网站开发技术国外做家居类的网站
  • 怎样上传自己做的网站正邦的网站建设
  • 做二手车那个网站会员性价比高wordpress打卡签到领红包
  • 靖江网站建设制作网站首页设计教程
  • 冶金工业建设工程定额总站网站国外seo比较好的博客网站
  • 大型网站系统架构汽车行业网站建设比较
  • 工商局网站官网网站建设宣传ppt模板下载
  • 一家专门做瓷砖特卖的网站室内平面图在线制作网站
  • 做那种事的网站html源码大全
  • 做网站的一般多钱2020新闻热点事件素材
  • 做个购物网站多少钱wordpress登录可见
  • 如何在建设银行网站查验回单陶瓷网站建设中企动力
  • 旅游网站案例分析市场代理招商信息
  • 学做分类网站公司网页设计html