簡體   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