2014-07-12 85 views
0

我正在使用boost::asio::ioservice創建一個具有100個線程的線程池。boost :: asio :: ioservice線程池正在同一線程上運行所有代碼ID

在while循環我要發佈5個線程來完成這項工作:

void dowork(int i) { 
    std::cout << "hello" << std::endl; 
    cout << " thread ID :" << boost::this_thread::get_id(); 
} 

然後我做work.reset()

儘管線程池大小爲100,但在發佈時並不需要5個線程。實際上,當我打印線程ID時,所有5個線程都是相同的。

所以它不是並行執行......爲什麼是這樣?

int main() { 
    int ch; 
    int i; 
    boost::asio::io_service ioservice; 
    boost::thread_group threadpool; 

    auto_ptr<boost::asio::io_service::work> work(
     new boost::asio::io_service::work(ioservice) 
    ); 

    for(i=0; i<100; i++) { 
     threadpool.create_thread(
      boost::bind(&boost::asio::io_service::run, &ioservice) 
     ); 
    } 

    ch=0; 
    while(ch <= 5) { 
     ch++; 
     cout << "in main" << boost::this_thread::get_id() << endl; 
     for(i=0; i<5; i++) { 
      ioservice.post(boost::bind(dowork,10)); 
     } 
     std::cout << "size=" << threadpool.size() <<std::endl; 
     work.reset(); 
     ioservice.reset(); 
     ioservice.run(); 
    } 
} 
+1

請編輯文本的牆以便讀取更多 – sp2danny

+0

您並未真正傳遞任何消息的線程,我認爲您需要返回文檔 – sp2danny

+0

@imran有幾個人編輯了您的問題。我把它從負面提高了,因爲如果它的寫法像最終版本一樣,那麼它就會很好。然而,請[注意更改](http://stackoverflow.com/posts/24710187/revisions)並專注於如何提出明確的問題。 [本指南MarkDown](http://stackoverflow.com/editing-help)應該是有幫助的;嘗試確保在發佈前預覽清晰。 – HostileFork

回答

0

如果你仔細觀察,第一批任務的是對「池子」的所有線程執行。看到它Live On Coliru

但是,在循環結束時,您重置工作。這導致所有線程退出[¹]。毫不奇怪,您的主線程將成爲發佈的後續任務的唯一處理線程。

我建議不要讓主線程在那裏調用run()。另外,使用100個線程是一個(大)反模式。對於這麼多工人來說,這是不尋常的。

#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/thread.hpp> 

boost::atomic_int tid_gen(0); 

void dowork(int i) { 
    thread_local int tid = ++tid_gen; 
    std::cout << "hello"; 
    std::cout << " thread ID :" << tid << "\n"; 
} 

int main() { 
    boost::asio::io_service ioservice; 
    boost::thread_group group; 

    boost::optional<boost::asio::io_service::work> work(boost::asio::io_service::work{ioservice}); 

    for(size_t i=0; i<boost::thread::hardware_concurrency(); i++) { 
     group.create_thread(
      boost::bind(&boost::asio::io_service::run, &ioservice) 
     ); 
    } 

    std::cout << "in main thread size=" << group.size() <<std::endl; 

    for(int i = 0; i <= 5; ++i) { 
     for(int i=0; i<5; i++) { 
      ioservice.post(boost::bind(dowork,10)); 
     } 

     boost::this_thread::sleep_for(boost::chrono::milliseconds(600)); 
     std::cout << "waking up\n"; 
    } 

    work.reset(); // allow threads to exit 
    group.join_all(); // await proper thread shutdown 
} 

查看它Live On Coliru


[¹]。 (事實上​​,如果你沒有,線程仍然會在程序退出時運行,導致未定義的行爲)。