簡體   English   中英

阻塞和非阻塞讀取有什么區別?

[英]What is the difference between a blocking and non-blocking read?

將等待/無等待指示符的概念添加到上述問題中作為TCP / IP或UDP環境中的ReadMessage函數的參數。

第三方功能描述指出:

此函數用於從隊列中讀取消息,該隊列由先前的registerforinput調用定義。 輸入等待/無等待指示符將確定此函數是否將阻止指定的隊列,等待數據放在隊列中。 如果指定了nowait選項且沒有可用數據,則會將NULL指針返回給調用者。 當可用數據時,此函數將返回指向從隊列讀取的數據的指針。

函數阻塞或非阻塞是什么意思?

阻止意味着您的代碼(在該線程中)的執行將在調用期間停止。 實質上,在阻塞操作完成之前,函數調用不會返回。

阻塞讀取將等待,直到有可用數據(或超時,如果有的話,到期),然后從函數調用返回。 非阻塞讀取將(或至少應該)立即返回,但如果當前沒有數據,則可能不會返回任何數據。

比喻如果你允許我 - 對不起,已經是下午很晚了,我心情很好,如果它被投票決定 - 啊......

你想進入一個時髦的夜總會,但保鏢告訴你,在有人出來之前你不能進去。 在這種情況下你被有效地“阻止”了。 當有人出來時,你可以自由進入 - 或者出現一些錯誤狀況,例如“那些訓練師嗎?” 在你進入之前,你的夜晚並沒有真正開始,你的享受被“阻擋”了。

在“非阻塞”場景中,您將告知保鏢您的電話號碼,並且當有空閑插槽時他會給您回電。 所以現在你可以在等待別人出來的時候做點別的事,你可以在其他地方開始你的夜晚,然后在被叫的時候回來繼續......

對不起,如果這沒有幫助...

看看這個: http//www.scottklement.com/rpg/socktut/nonblocking.html

以下是一些摘錄:

  • '默認情況下,TCP套接字處於“阻塞”模式。 例如,當您調用recv()從流中讀取時,控件不會返回到您的程序,直到從遠程站點讀取至少一個字節的數據。 等待數據出現的這個過程稱為“阻塞”。

  • '可以設置描述符,使其處於“非阻塞”模式。 當處於非阻塞模式時,您永遠不會等待操作完成。 如果您需要在許多不同的連接套接字之間切換,並且希望確保它們都不會導致程序“鎖定”,這是一個非常寶貴的工具。

此外,嘗試首先搜索答案通常是一個好主意(只需在搜索引擎中鍵入“阻止與非阻塞讀取”),然后一旦你碰到那里的牆就會問你不能問的問題。找到答案。 我上面分享的鏈接是第二個搜索結果。 在互聯網論壇上提問之前,先看一下這篇關於該怎么做的精彩文章: http//www.catb.org/~esr/faqs/smart-questions.html#before

在您的情況下,這意味着在實際返回消息之前,函數不會返回。 它會阻止你的程序繼續前進,但是當它向前推進時你會有一個消息可以使用。

如果指定nowait ,如果隊列中沒有消息,則會立即返回空指針,這允許您處理該情況。

暫無
暫無

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

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