C++ 线程池
2015-07-09 15:11
513 查看
简单的线程池实现
下面这段代码摘自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
相关文章推荐
- C++ 字符函数库cctype
- VC++ 句柄要及时关闭否则经常性调用句柄会持续增加
- 【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解
- C++ 逻辑表达式&& || !
- C++中的成员对象
- VC++ combo box控件的使用
- 【C语言】求数值的正数次方
- 【C语言】打印1到最大的n位数
- C/C++文件输入输出操作——FILE*、fstream、windowsAPI
- 研究了一下关于c/c++编译器关于导出函数的不同处理
- c语言 DEBUG 日志打印
- C++参数初始化表
- 结构体的嵌套
- LeetCode-Number of Digit One-解题报告
- GCC版本切换,-std=c++11问题
- VS2008非托管c++访问webservice服务
- C++知识点随笔(六):模板
- const修饰符 const与指针
- c实现 推箱子游戏
- glOrtho()函数