2009-09-29 125 views
1

全部:跨進程的異步IO

我在寫日誌解決方案。其中一個可用的日誌端點是一個文本文件。假設我想從多個進程寫入該文件:我可以打開它共享的文件,並使用命名的互斥體來控制併發訪問文件(假設所有訪問都發生在同一臺機器上)。但後來我開始懷疑異步IO。在一個進程中,我可以使用BeginWrite異步發佈我的寫入。跨進程或跨機器問題呢?在這些情況下,異步IO是否安全?

(假定當我調用BeginWrite(),我通過緩衝區包含應該在一個合理的「記錄」放在一起的一切)

回答

3

在您決定使用異步IO解決方案之前,請注意,您經常認爲異步寫入最終會被同步處理。對於您的日誌記錄解決方案特別重要的是在Asynchronous Disk I/O Appears as Synchronous on Windows NT, Windows 2000, and Windows XP中隱藏一小段消息。在這裏討論的是這個塊:

「在Windows NT上,對擴展其長度的文件的任何寫操作都是同步的。」

雖然說「Windows NT」,但我的經驗是,Windows 2000,Windows XP和Server 2003也是如此。我認爲他們的意思是「NTFS」而不是「Windows NT」。我還沒有在Vista或Server 2008上測試它。

該文章繼續爲該限制提供可能的解決方案。我假設他們工作,但實際上沒有嘗試過。

我找到的最可靠的解決方案是產生一個執行同步寫入的線程。脖子上的一種痛苦,真實但有效。

0

我不知道你錯了意思。如果您正在使用適當的跨進程互斥鎖守護文件,那麼即使使用異步I/O,您在給定時間也只會有1個進程寫入文件。假定您保持互斥鎖鎖定,直到異步I/O完成。

+0

我同意互斥。但是,如果IO發生在不同的機器上(共享上),則互斥體對另一臺機器將不可見。這讓我想知道O/S如何處理重疊的I/O,以及是否內置保護以確保一次只發生一次寫入。 – JMarsch 2009-09-29 16:31:47