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