微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我使用的是 boost beast 1.74.0。在另一个线程中,我尝试关闭 websocket,但代码在“acceptor.accept(socket,endpoint)”处被破坏,我在调用关闭后收到“信号: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,getHeaderServer()
            ).detach();
        }

关闭一个线程调用函数

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

  • 既然听起来你想终止接受循环,为什么不“简单地”取消接受器呢?我不完全确定这适用于同步操作,但您当然可以轻松使用异步接受。

    注意同步对接受者对象本身的访问。这意味着要么在执行 cancel 的同一线程上运行 async_accept,要么从同一 strand 运行。在这一点上,异步完成整个事情听起来肯定更容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?