C++ 线程池
来源:互联网 发布:linux 退出文件编辑 编辑:程序博客网 时间:2024/06/05 02:04
简单的线程池实现
下面这段代码摘自CppCMS thread_pool.cpp 。
CppCMS是一个C++ 的Web开发框架,用于可发展的网站,性能极高。推荐给大家使用。
///////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details./////////////////////////////////////////////////////////////////////////////////#define CPPCMS_SOURCE#include <cppcms/thread_pool.h>#include <booster/backtrace.h>#include <booster/log.h>#include <ostream>#include <list>#include <vector>#include <cppcms/config.h>#ifdef CPPCMS_USE_EXTERNAL_BOOST# include <boost/bind.hpp>#else // Internal Boost# include <cppcms_boost/bind.hpp> namespace boost = cppcms_boost;#endif#include <booster/shared_ptr.h>#include <booster/thread.h>#if defined(CPPCMS_POSIX)#include <signal.h>#endif namespace cppcms {namespace impl { class thread_pool : public booster::noncopyable { public: bool cancel(int id) { booster::unique_lock<booster::mutex> lock(mutex_); queue_type::iterator p; for(p=queue_.begin();p!=queue_.end();++p) { if(p->first==id) { queue_.erase(p); return true; } } return false; } int post(booster::function<void()> const &job) { booster::unique_lock<booster::mutex> lock(mutex_); int id=job_id_++; queue_.push_back(std::make_pair(id,job)); cond_.notify_one(); return id; } thread_pool(int threads) : shut_down_(false), job_id_(0) { workers_.resize(threads); #if defined(CPPCMS_POSIX) sigset_t set,old; sigfillset(&set); pthread_sigmask(SIG_BLOCK,&set,&old); #endif for(int i=0;i<threads;i++) { workers_[i].reset(new booster::thread(boost::bind(&thread_pool::worker,this))); } #if defined(CPPCMS_POSIX) pthread_sigmask(SIG_SETMASK,&old,0); #endif } void stop() { { booster::unique_lock<booster::mutex> lock(mutex_); shut_down_=true; cond_.notify_all(); } for(unsigned i=0;i<workers_.size();i++) { booster::shared_ptr<booster::thread> thread=workers_[i]; workers_[i].reset(); if(thread) thread->join(); } } ~thread_pool() { try { stop(); } catch(...) { } } private: void worker() { for(;;) { booster::function<void()> job; { booster::unique_lock<booster::mutex> lock(mutex_); if(shut_down_) return; if(!queue_.empty()) { queue_.front().second.swap(job); queue_.pop_front(); } else { cond_.wait(lock); } } if(job) { try { job(); } catch(std::exception const &e) { BOOSTER_ERROR("cppcms") << "Catched exception in thread pool" << e.what() <<'\n' << booster::trace(e); } catch(...) { BOOSTER_ERROR("cppcms") << "Catched unknown exception in thread pool"; } } } } booster::mutex mutex_; booster::condition_variable cond_; bool shut_down_; int job_id_; typedef std::list<std::pair<int,booster::function<void()> > > queue_type; queue_type queue_; std::vector<booster::shared_ptr<booster::thread> > workers_; };}thread_pool::thread_pool(int n) : impl_(new impl::thread_pool(n)){}int thread_pool::post(booster::function<void()> const &job){ return impl_->post(job);}void thread_pool::stop(){ impl_->stop();}bool thread_pool::cancel(int id){ return impl_->cancel(id);}thread_pool::~thread_pool(){}} // cppcms
0 0
- c++/c实现线程池
- ThreadPool 线程池[c#]
- ThreadPool 线程池[c#]
- ThreadPool 线程池[c#]
- c实现线程池
- linux c线程池
- ThreadPool 线程池[c#]
- Linux C线程池
- 线程池 c 实现
- Linux C 线程池
- linux c 线程池
- C 线程池 thread_pool
- C/C++ 线程池
- Linux C 线程池
- c/c++线程--3线程池
- Linux C 实现线程池
- c语言实现线程池
- C 语言创建线程池
- IOS屏幕适配
- winfrom窗体的Anchor属性、Dock属性
- 更改VLC源码 实现使用libVLC录像功能
- Siemens.NX.v10.0.1.MP03.Update.Only.Win64.&.Linux64 2CD 计算机辅助设计与制造
- 解析Joomla!模板
- C++ 线程池
- MySQL redo log及recover过程
- LeetCode——Word Break
- 编程小错误备忘录
- html文件替换其中的href的内容
- 集成开发环境IAR.Embedded.Workbench.for.ARM.V7.40
- 报工提示错误:“没有内部作业价格可被确认”的解决方法
- UI_KVC赋值
- Android微信分享图片大于32k进行压缩