簡體   English   中英

std :: iostream是否是非阻塞的?

[英]Is std::iostream non-blocking?

根據Boost.Iostreams的提升參考(在第3.6節,在最底部):

http://www.boost.org/doc/libs/1_64_0/libs/iostreams/doc/index.html

雖然Boost.Iostreams過濾器和設備概念可以適應非阻塞i / o,但C ++標准庫流和流緩沖接口不能,因為它們缺乏區分臨時和永久失敗以滿足讀或寫請求的方法

但是,函數std::istream::readsome似乎是非阻塞的,因為可以立即返回可用字符,而不會阻塞(RAM副本除外)等待。 我的理解是:

std::istream::read將阻塞,直到std::istream::read eof或字符數。

std::istream::readsome將立即返回從內部緩沖區復制的字符。

我同意你的說法, readsome不是阻塞操作。 然而,如所指定的,作為用於執行通常稱為“非阻塞I / O”的接口,它完全不合適。

首先,有沒有保證, readsome回到新的數據,即使它是可用的。 因此,為了確保您實際取得進展,您必須最終使用其中一個阻止接口。

其次,沒有辦法知道readsome什么時候會返回數據。 無法“輪詢”流,或獲取“通知”或“事件”或“回調”。 可用的非阻塞接口至少需要其中一個。

簡而言之, readsome似乎是一種readsome指定的嘗試,為I / O流提供非阻塞接口。 但我從未見過它在生產代碼中使用過,我不希望這樣。

我認為Boost文檔誇大了論證,因為正如你所觀察到的, readsome肯定能夠區分暫時性和永久性失敗。 但由於上述原因,他們的結論仍然是正確的。

在研究非阻塞可移植性時,我沒有在C ++標准庫中找到任何看起來像你認為的那樣的東西。

如果您的目標是可移植性,我的解釋是,最重要的部分是:

http://en.cppreference.com/w/cpp/io/basic_istream/readsome

例如,當與std :: ifstream一起使用時,一旦文件被打開,一些庫實現就會用數據填充底層的filebuf(並且這些實現上的readsome()讀取數據,可能但不一定是整個文件),而其他實現僅在請求實際輸入操作時從文件讀取(並且在文件打開后發出的readsome()從不提取任何字符)。

這表示使用iostream接口的不同實現允許懶惰地執行其工作,並且readsome()不保證工作甚至被啟動。

但是,我認為您對readome的解釋保證不會阻止是真的。

暫無
暫無

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

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