![](/img/trans.png)
[英]How to listen to websocket feed using boost beast websocket client?
[英]How interrupt a websocket (using boost beast) from another thread?
我正在使用 boost beast 1.74.0。 在另一个线程中,我尝试关闭 websocket 但代码在“acceptor.accept(套接字,端点)”处被破坏,并且在调用关闭后我收到“信号:SIG32(实时事件 32)”。
从代码到监听连接,我需要更改什么才能正确中断接受服务?
...
_acceptor = &acceptor;
_keepAlive = true;
while (_keepAlive) {
tcp::socket socket{ioc};
// Block until we get a connection
acceptor.accept(socket, endpoint);
// Launch the session, transferring ownership of the socket
std::thread(
&WebSocketServer::doSession,
std::move(socket),
this,
this,
getHeaderServer()
).detach();
}
关闭另一个线程的 function 调用
void WebSocketServer::close() {
if (_acceptor != nullptr) this->close();
_keepAlive = false;
}
glibc
使用 SIG32 来表示取消使用 pthread 库创建的线程。 你在尝试使用pthread_kill
吗?
如果不是,您可能只是因为在 GDB 下运行它而看到它。这应该可以通过告诉 GDB 忽略它来解决:
handle SIG32 nostop noprint
最后回到原来的问题:
Boost Thread 中有中断点。 如果您可以切换到 Boost Thread boost::thread
而不是std::thread
,它们可以帮助您。 此外,您必须更改线程的代码以实际检查中断: https://www.boost.org/doc/libs/1_75_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.interruption
既然这听起来像是您想终止接受循环,为什么不“简单地”取消接受者呢? 我不完全确定这是否适用于同步操作,但您当然可以轻松地使用异步接受。
注意同步访问接受者 object 本身。 这意味着要么在执行
async_accept
的同一个线程上运行cancel
,要么从同一个strand
运行。 至此,听起来确实更容易异步完成整个事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.