2011-11-04 61 views
1

是否有可能對io_service.run_one()的嵌套調用不是boost :: asio的有效使用。Boost :: asio和嵌套/遞歸service.run()/ run_one()

例如我有一個處理程序,它在套接字上接收到某個東西后執行。 io_service正在使用io_service.run_one()在另一個線程中運行。因此,在我看來,服務接收處理程序後,io_service將停止。

然後在接收處理程序中,我再次執行io_service.run_one()以便通過套接字發送一些東西。這意味着,存在io_service.run_one()方法的嵌套/遞歸調用。

此行爲不起作用。我的意思是有時run_one()方法中有一個塊永遠不會返回。我也找不到有關這個特殊情況的任何文件處理。

那麼,是否允許遞歸/嵌套io_service執行或者這不是一個好行爲?

P.S. io_service.reset()在每個run_one()執行前使用。

回答

3

據我所知,這既不是既定的使用,也沒有記錄在asio中,所以它看起來像一個安全的假設是:不,它是無效的。

現在,它可能在某些或所有平臺上工作。儘管如此,這並不一定是個好主意。

此外,如果您不打算在您的處理程序內部阻止,請致電run_one(),則可能需要考慮poll_one()

無論哪種方式,它絕對聽起來這樣做的可疑。大概你假設正在發送一個特定的消息,以便你可以立即做一些工作?我只能想到非常人爲的例子,假設兩條消息在asio消息隊列中背靠背是安全的。

+0

事實上,我也認爲這不是安全使用asio的方法。我已經將完整的實現改爲基於狀態(比如自動機),並且不再遇到任何阻塞問題。看起來,如果從處理程序調用run_one()方法有時可能永遠阻塞。 – cgart