繁体   English   中英

如何从另一个线程中断 websocket(使用 boost beast)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM