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

私は、テストされた全体のコードを追加し、それは動作します。 –

関連する問題