簡體   English   中英

提升asio - 停止io_service

[英]Boost asio - stopping io_service

我正在使用boost :: asio來做一些非常基本的UDP數據包收集。 io_service對象在工作線程中實例化,並且從該線程內部調用io_service.run()。 我的問題是當我收集數據包時讓io_service.run()返回。

我不清楚當停止我的工作線程時,可以從其他線程調用哪些io_service方法。 我有一個對io_service對象的引用,並且從另一個線程我進行了這個調用:

ios.dispatch( boost::bind( &udp_server::handle_kill, this ) );

在我的udp_server類中,該函數的處理程序從一個boost :: asio :: ip :: udp :: socket和一個boost :: asio :: deadline_timer對象中取消待處理的工作。 兩者都有未決的異步工作要做。 那時我調用ios.stop():

void udp_server::handle_kill()
{
    m_socket.cancel();
    m_timer.cancel();
    m_ios.stop();
}

由於沒有待處理的工作,我希望此時我對ios.run()的調用應該返回 - 但這不會發生。

那為什么不回來呢? 對我來說最可能的解釋是我不應該從另一個線程調用io_service :: dispatch()。 但是dispatch()方法似乎只是為了做到這一點 - 在io_service :: run()工作的線程中調度一個函數調用。它似乎就是這樣做的。

所以這給我留下了一些相關的問題:

  1. 我正確使用io_service :: dispatch()嗎?
  2. 如果所有任務都被取消,是否有任何理由不能返回io_service :: run()?
  3. socket :: upd :: cancel()似乎不是關閉套接字並中止所有工作的正確方法。 什么是正確的方法?

asio對我來說表現很好,但我需要更好地理解這一點架構。

更多數據

socket :: udp :: cancel()在Win32下的開放套接字上顯然是一個不受支持的操作 - 所以這個操作失敗了拋出異常 - 這實際上導致從io_service :: run()退出,但絕對不是所希望的出口。

socket :: udp :: close()似乎沒有取消掛起的async_receive_from()任務,所以調用它而不是socket :: udp :: cancel()似乎將線程留在io_service :: run()中的某個地方。

從另一個線程調用io_service::stop是安全的,這在文檔中有詳細描述

線程安全

不同的對象 :安全。

共享對象 :安全,但有未完成的run(),run_one(),poll()或poll_one()調用時調用reset()會導致未定義的行為。

正如你的問題的評論所表明的那樣,你真的需要把它歸結為一個可重復的例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM