2016-11-10 87 views
0

我有以下代码在类的构造函数中创建线程池。线程立即创建并退出。 请帮忙。C++类的构造函数中的线程池正在死亡

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

而你没有输出? – Marco

+0

@Marco,没有输出。 – Arpit

回答

2

的boost ::支持ASIO :: io_service对象::工作工作必须是类的成员,因此它不会被破坏。

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; 
} 
+0

我试过这个选项..但没有运气! – Arpit

+0

你是什么意思,它不工作?在发布的代码中,您正在构造函数内创建一个工作对象,一旦构造函数完成,它就会被销毁,离开io_service而无法运行。 – Arunmu

+1

我添加了整个代码,经过测试并且可以正常工作。 –