Как прервать работу веб-сокета (используя Boost beast) из другого потока?

Пользуюсь boost beast 1.74.0. в другом потоке я пытаюсь закрыть веб-сокет, но код не работает в 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();
        }

закрыть вызов функции другим потоком

void WebSocketServer::close() {
    if (_acceptor != nullptr) this->close();
    _keepAlive = false;
}

person Sileno Brito    schedule 29.01.2021    source источник


Ответы (1)


glibc использует SIG32 для сигнализации об отмене потоков, созданных с помощью библиотеки pthread. Вы пытаетесь использовать pthread_kill?

В противном случае вы можете быть свидетелем этого только потому, что запускаете его под GDB. Что должно быть исправлено, если GDB игнорирует это:

handle SIG32 nostop noprint

Наконец, к исходному вопросу:

person sehe    schedule 29.01.2021