2013-08-02 63 views
2

我發現從std :: thread訪問tcp::socket會導致程序終止。 以下是來自boost的示例程序。 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/echo/blocking_tcp_echo_server.cpp 編譯它:g++ blocking_tcp_echo_server.cpp -std=c++11 -lboost_system -lboost_thread -pthreadC++ 11線程在訪問boost時崩潰:: asio :: ip :: tcp :: socket

到目前爲止,everthing正常工作。 但是,如果你用std :: thread(和#include)替換boost :: thread,程序在訪問sock成員時會崩潰(終止)(socket::read_some())。

錯誤消息:在沒有活動異常的情況下終止調用。

任何想法?

回答

1

這就是boost::threadstd::thread之間的差異。我見過的代碼,你可以解決它與std::thread工作,就像這樣:

void server(boost::asio::io_service& io_service, short port) { 
    // ... 
    std::thread t(boost::bind(session, sock)); 
    t.detach(); 
} 

看來你必須分離,或當您使用std::thread加入線程。

代碼:

#include <iostream> 
#include <thread> 

int main(void) { 
    std::thread t([](){std::cout << "will throw exception" << std::endl;}); 
// t.detach(); 
    return 0; 
} 

它會拋出異常,如果不分離不參加無法鏈接並行線程

+0

它的工作原理。謝謝。 看起來我不應該找出C++ 11庫和Boost庫之間的區別,以避免類似的問題。 – avhacker

+0

@avhacker請注意,Boost.Thread的這種行爲現在已被棄用:http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html#thread.thread_management.thread.destructor –

相關問題