2016-11-10 4 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

повышение :: 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

Я добавил весь код, протестирован и работает. –

Смежные вопросы