簡體   English   中英

boost :: asio :: io_service :: poll()帶來的麻煩

[英]troubles with boost::asio::io_service::poll()

以下代碼:

/***************************************************************************/

boost::mutex m;

struct func {
   func(int v):n(v) {}
   void operator()() {
      {  boost::mutex::scoped_lock l(m);
         std::cout << "run function " << n << std::endl;
      }
      for ( int idx = 0; idx < 4; ++idx ) {
         {  boost::mutex::scoped_lock l(m);
            std::cout << "function " << n << ", ping " << idx << std::endl;
         }
         sleep(1);
      }
   }

private:
   int n;
};

/***************************************************************************/

int main(int argv, const char** argc) {
   boost::asio::io_service io;

   for ( int idx = 0; idx < 4; ++idx ) {
      io.post(func(idx));
   }

   std::cout << "before run" << std::endl;
   io.poll();
   std::cout << "after run" << std::endl;

   std::cin.get();

   return 0;
}

/***************************************************************************/

給出這樣的輸出:

**before run**
run function 0
function 0, ping 0
function 0, ping 1
function 0, ping 2
function 0, ping 3
run function 1
function 1, ping 0
function 1, ping 1
function 1, ping 2
function 1, ping 3
run function 2
function 2, ping 0
function 2, ping 1
function 2, ping 2
function 2, ping 3
run function 3
function 3, ping 0
function 3, ping 1
function 3, ping 2
function 3, ping 3
**after run**

但是,根據文件:

poll()函數運行准備運行的處理程序,無需阻塞,直到io_service已停止或沒有更多就緒處理程序。

poll() - 是一種非阻塞方法。 有什么問題?

第二個問題:在文件中說:

return已執行的處理程序數。

如果它是非阻塞的,它會返回什么價值? - 隊列中的對象數量? - 但這與“被執行的”不同。

這是一個老問題,但你從未真正得到關於run vs poll的答案。

只要有事情要做,io_service :: run就會繼續運行,例如等待截止時間計時器或IO完成通知等。這就是為什么有工作對象保持退出運行的原因。

io_service :: poll只會執行就緒處理程序,並且在沒有准備好調度的處理程序之前不會返回。

換句話說,運行將等待掛起的處理程序准備就緒,如計時器或IO完成通知,而poll將在那種情況下返回。

如果要執行某些空閑處理,此行為很有用。

非阻塞與異步不同。 pool同步運行准備運行的處理程序,並在不阻塞的情況下返回並等待另一個處理程序。

補充說明。 阻止輸入操作是在沒有找到輸入數據的情況下開始無休止等待的操作。 考慮讀操作,它應該從某個端口讀取一個字節,但沒有輸入數據。 在這種情況下,Read call掛起,僅在收到byte時返回。 如果沒有輸入信息,則非阻塞讀取操作立即返回。

池操作是非阻塞的。 它同步執行所有掛起的請求並返回。 如果沒有傳入請求,則立即返回輪詢。

暫無
暫無

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

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