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



我发现从std::线程访问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

到目前为止,一切都很好。但是,如果用std::thread(和#include)替换boost::thread,程序在访问sock成员(socket::read_some())时将崩溃(终止)。

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

知道吗?

这就是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

,它将抛出异常

最新更新