访问boost :: asio :: ip :: tcp :: socket时C ++ 11线程崩溃

时间:2013-08-02 04:06:22

标签: multithreading boost c++11 boost-asio

我发现从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 -pthread

到目前为止,everthing工作正常。 但是如果用std :: thread(和#include)替换boost :: thread,程序将在访问sock成员(socket::read_some())时崩溃(终止)。

错误消息:在没有活动异常的情况下终止调用。

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
}

如果未分离未加入未链接pthread

,则会抛出异常