我发现从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::thread
和std::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