將等待/不等待指示符的概念作爲TCP/IP或UDP環境中ReadMessage函數的參數添加到上述問題中。阻塞和非阻塞讀取之間有什麼區別?
第三方功能說明指出:
此功能用於從將其通過先前registerforinput呼叫定義的隊列中讀取的消息。輸入等待/不等待指示器將確定此函數是否會阻塞指定的隊列,等待數據放入隊列中。如果nowait選項被指定並且沒有數據可用,則將返回給調用者的NULL指針。當數據可用時,此函數將返回一個指向從隊列讀取的數據的指針。
函數阻塞或非阻塞是什麼意思?
將等待/不等待指示符的概念作爲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
我在我創建的一個線程內,我確實希望只有在數據可用時才從隊列中讀取數據,否則,當沒有數據時,我想要處理器檢查其他線程(例如,創建了這個線程)。我使用哪一個?阻塞或非阻塞選項? – user553514 2011-03-10 17:15:39
我確實去了互聯網,但不知何故,我沒有直接相關或有用的東西。堆棧溢出享有偉大的頭腦賞金。所以我只問在這裏,如果我沒有成功的谷歌搜索。謝謝您的回覆。 – user553514 2011-03-10 17:21:52
不用擔心。無論如何,我希望上面的答案是有幫助的。看看我鏈接到的文章,也是 - 這是一個很棒的閱讀。 – 2011-03-10 21:16:14
打個比方,如果你允許我 - 對不起,這是下午晚些時候,我的心情,如果它下來投 - 不錯啊......
你想進入一個時髦夜總會,但保鏢告訴你,除非有人出門,否則你不能進去。在這種情況下,你被「封鎖」了。當有人出來時,你可以自由進入 - 或者某些錯誤情況,例如「那些培訓師?」直到你入場,你的夜晚纔會真正開始,你的享受被「封鎖」。
在「非阻塞」情況下,您會告訴保安人您的電話號碼,並且他會在有空閒時間後給您回電。所以現在你可以做別的事情在等待有人來了,你可以在其他地方開始你晚上回來調用時,繼續有......
很抱歉,如果沒有幫助...
就你而言,這意味着該函數在實際返回消息之前不會返回。它會阻止你的程序向前發展,但是當它向前發展時,你將會得到一個信息。
如果指定nowait
,如果隊列中沒有消息,則可以立即返回空指針,從而允許您處理該情況。
我在我創建的一個線程內,並且我希望只在數據可用時才從隊列讀取,否則,當沒有數據時,我想要處理器檢查其他線程(例如,我創建的主線程線程) – user553514 2011-03-10 17:16:14
@ user553514:「block」表示這個執行線程阻塞。當這個線程被阻塞時,其他線程仍然可以被調度。 – 2011-03-10 18:50:31
@SteveJessop:謝謝你澄清誰被阻止。這是我的主要困惑。 – user553514 2011-03-10 20:57:40