2012-09-10 46 views
2

this article,部分「更多的等待......」,當筆者談到同步I/O與線程,第一個例子,他給人的是:與調用線程同步I/O?

hFile = CreateFile(....,FILE_IO_OVERLAPPED,...); 
ReadFile(hFile,...) 
< Do some computation.> 
WaitForSingleObject(hFile,INFINITE); 

我的印象是既「的CreateFile」和「 ReadFile'是同步 API,不是嗎?爲什麼這裏需要'WaitForSingleObject'? 'CreateFile'和'ReadFile'會阻止,直到操作結束然後返回?

然後當作者談論'可警告的等待'時會出現更多混亂。它是什麼,WaitForSingleObjectEx()之後的線程狀態?那麼爲什麼筆者給:

while (WaitForSingleObject(hObject,TRUE)==WAIT_IO_COMPLETION); 

爲例代替

while (WaitForSingleObjectEx(hObject,TRUE)==WAIT_IO_COMPLETION); 

,並應 'EX' 功能一起想:

hFile = CreateFile(....,FILE_IO_OVERLAPPED,...); 
ReadFileEx(hFile,...) 
< Do some computation.> 
while (WaitForSingleObjectEx(hObject,TRUE)==WAIT_IO_COMPLETION); 

任何一個可以解釋一下?

感謝,

回答

2

該文件還指出以下幾點:

異步I/O是一種操作系統提供了讓 I/O指令在後臺執行,這個想法遭到了粗暴的 是對ReadFile呼叫或WriteFile將立即返回到 調用者,並將I/O操作本身與計算 的線程重疊,該線程首先調用它。該技術僅適用於其驅動程序支持異步I/O的I/O設備,並且通過可傳遞給CreateFile調用的標誌FILE_IO_OVERLAPPED 向程序員證明其自身。在這樣的文件對象上執行的I/O將表現得與同步I/O完全不同。

的方法是根據傳遞到的CreateFile

+0

感謝。 Yossarian我在這個問題上太粗心了 – user1559625

3

好了,你引用的代碼,但顯然沒有閱讀它:-)「重疊IO」是異步。

至於警戒等待,我不認爲他們經常使用。

+0

愚蠢的我是:(因爲錯過了 'FILE_IO_OVERLAPPED' 謝謝基督教 – user1559625

2

這些參數同步/異步是相當多的問題。

我覺得'CreateFile'和'ReadFile'都是同步API,不是嗎?

兩者都是如此。它取決於您傳遞給Create/Read FileFunction的參數。 你可以閱讀更多關於它here。一個簡短的摘錄:

...如果用FILE_FLAG_OVERLAPPED打開hFile,它是一個異步文件句柄;否則它是同步的....

關於第二個問題我想WaitForSingleObject是錯誤的,應該是WaitForSingleObjectEx

如果使用功能的防爆型,或者如果你需要的防爆型與否的附加功能不依賴。儘管如果你將它們混合在你的代碼中,我認爲它是不好的風格。

+0

沒有一個'WaitFor ...()'函數支持文件句柄作爲輸入,對於重疊的I/O,你必須使用帶有等待事件的OVERLAPPED結構通過'CreateEvent()'代替,那麼你可以等待事件,而不是文件可怕ctly。 –

0

Read the documentationReadFile()

該功能被設計用於同步和異步操作。

ReadFile()是異步的,如果FILE_FLAG_OVERLAPPED傳遞給CreateFile()OVERLAPPED結構被傳遞給ReadFile(),如:

hFile = CreateFile(..., FILE_IO_OVERLAPPED, ...); 
... 
OVERLAPPED ol = {0}; 
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
if (!ReadFile(hFile, ..., &ol)) 
{ 
    if (GetLastError() != ERROR_IO_PENDING) 
    { 
     // error... 
    } 
} 
... 
WaitForSingleObject(ol.hEvent, INFINITE); // or GetOverlappedResult(hFile, &ol, ..., TRUE);