我有以下代码,它在类的构造函数中创建线程池。线程已立即创建并退出。 请帮忙。
class ThreadPool {
public:
boost::asio::io_service io_service;
boost::thread_group threads;
ThreadPool();
void call();
void calling();
};
ThreadPool::ThreadPool() {
/* Create thread-pool now */
size_t numThreads = boost::thread::hardware_concurrency();
boost::asio::io_service::work work(io_service);
for(size_t t = 0; t < numThreads; t++) {
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
}
}
void ThreadPool::call() {
std::cout << "Hi i'm thread no " << boost::this_thread::get_id() << std::endl;
};
void ThreadPool::calling() {
sleep(1);
io_service.post(boost::bind(&ThreadPool::call, this));
}
int main(int argc, char **argv)
{
ThreadPool pool;
for (int i = 0; i < 5; i++) {
pool.calling();
}
pool.threads.join_all();
return 0;
}
答案 0 :(得分:2)
boost :: asio :: io_service :: work work 必须是该类的成员,因此不会被破坏。
class ThreadPool {
public:
boost::asio::io_service io_service;
boost::thread_group threads;
boost::asio::io_service::work *work;
ThreadPool();
void call();
void calling();
void stop() { delete work; }
};
ThreadPool::ThreadPool() : work(new boost::asio::io_service::work(io_service)) {
/* Create thread-pool now */
size_t numThreads = boost::thread::hardware_concurrency();
for(size_t t = 0; t < numThreads; t++) {
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
}
}
void ThreadPool::call() {
std::cout << "Hi i'm thread no " << boost::this_thread::get_id() << std::endl;
};
void ThreadPool::calling() {
Sleep(1000);
io_service.post(boost::bind(&ThreadPool::call, this));
}
int main()
{
ThreadPool pool;
for (int i = 0; i < 5; i++) {
pool.calling();
}
pool.stop();
pool.threads.join_all();
return 0;
}