boost asio--作为线程池使用
正如其名字,asio是一个异步网络库。但第一次使用它却是把它作为一个线程池的实现。下面是一段实验代码。
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
void foo() {
sleep(1);
printf("foo: %d\n", (int)pthread_self());
}
class TaskPool {
typedef boost::shared_ptr<boost::thread> Thread;
public:
TaskPool(std::size_t num_workers) : num_workers_(num_workers) {
}
void Start() {
manage_thread_.reset(new boost::thread(boost::bind(TaskPool::_Start, this)));
}
void Post() {
ios_.post(foo);
}
private:
static void _Start(TaskPool* pool) {
for (std::size_t i = 0; i < pool->num_workers_; ++i) {
pool->workers_.push_back(Thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &pool->ios_))));
}
for (std::size_t i = 0; i < pool->workers_.size(); ++i) {
pool->workers_[i]->join();
}
}
private:
std::size_t num_workers_;
boost::asio::io_service ios_;
std::vector<Thread> workers_;
Thread manage_thread_;
};
int main()
{
TaskPool pool(8);
pool.Start();
for (int i = 0; i < 1000; ++i) {
pool.Post();
}
printf("post finished\n");
sleep(10);
return 0;
}