2015-10-09 132 views
2

我使用boost日間例程作爲需要機器間雙向通信的項目的啓動器,現在需要在自己的線程中啓動asio io_service,以便可以跨數據傳遞seperatley。這裏是我的代碼的基礎:http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/tutorial/tutdaytime7/src.html在boost線程中運行boost asio io_service

如果我調用該服務的主要有

io_service.run() 

但是,如果我嘗試創建一個線程組,並推出有像這樣這一切工作正常:

int main() 
{ 
    boost::thread_group tgroup; 
    try 
    { 
    boost::asio::io_service io_service; 
    tcp_server server1(io_service); 
    udp_server server2(io_service); 

    tgroup.create_thread(boost::bind(&boost::asio::io_service::run, &io_service)); 

    std::cout << "Server running on TCP port " << tcpport << std::endl << "Server running on UDP port " << udpport << std::endl; 

    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 

    tgroup.join_all(); 
    return 0; 
} 

代碼編譯並運行時,端口號被cout正確引用,但似乎並未打開偵聽端口,因爲客戶端獲取連接時被拒絕,儘管服務器程序似乎在等待連接。

這裏發生了什麼事?

回答

2

我的猜測是,你的代碼將工作,如果你把tgroup.join_all();catch

... 
try { 
    boost::asio::io_service io_service; 
    tcp_server server1(io_service); 
    udp_server server2(io_service); 

    tgroup.create_thread(boost::bind(&boost::asio::io_service::run, &io_service)); 

    std::cout << "Server running on TCP port " << tcpport << std::endl << "Server running on UDP port " << udpport << std::endl; 
    tgroup.join_all(); 
} 
... 

io_service和服務器對象超出範圍這裏被摧毀,可能是之前從線程組的線程甚至開始運行。

相關問題