我有兩個線程,一個寫入文件,一個讀取同一個文件。 我使用CreateFile & WriteFile,寫入器線程中的FlushFileBuffers,並且讀取器線程使用FtpPutFile。C++/Win32重疊文件讀/寫訪問:我應該使用Mutex還是什麼?
如何在這裏實現一個簡單的windows32互斥鎖? (我多年沒有用過)
或者,這是否有可能將正確的標誌發送到CreateFile? (我試過,但沒有運氣)
我有兩個線程,一個寫入文件,一個讀取同一個文件。 我使用CreateFile & WriteFile,寫入器線程中的FlushFileBuffers,並且讀取器線程使用FtpPutFile。C++/Win32重疊文件讀/寫訪問:我應該使用Mutex還是什麼?
如何在這裏實現一個簡單的windows32互斥鎖? (我多年沒有用過)
或者,這是否有可能將正確的標誌發送到CreateFile? (我試過,但沒有運氣)
如何實現一個簡單的互斥:
創建與CreateMutex功能或CreateMutexEx互斥。完成後您需要撥打CloseHandle。一旦你的互斥體,那麼你可以調用WaitForSingleObject同步您的來電(不要忘記調用ReleaseMutex當你做。最後,這裏是使用互斥對象的example。
謝謝!這答案的一半。 – user1581390 2012-08-09 13:52:30
@ user1581390 - 請注意David的評論,儘量減少持有鎖的時間。 – pstrjds 2012-08-09 14:00:00
已經做到了。事情是我想優化exe的大小,我寧願不添加任何更多的#includes或使用互斥,除非我絕對必須這樣做。 – user1581390 2012-08-09 14:07:20
你並不需要一個互斥。您可以安全地讀取和寫入多個線程中的同一個文件。您可以多次打開文件,以便每個線程都有自己的文件句柄,因此具有自己的文件指針,或者可以使用重疊的I/O來讀取或寫入。在特定的位置
您不必打開重疊我的文件/ O可以只是這樣做:
LARGE_INTEGER off = offset;
OVERLAPPED ov = { 0 };
ov.Offset = off.LowPart;
ov.OffsetHigh = off.HighPart;
ReadFile(handle, buffer, count, &bytesRead, &ov);
這允許您以原子方式讀取文件中的特定位置(offset
),因此您不必調用SetFilePointerEx
並擔心另一個線程搞亂了指針。同樣的東西適用於寫作。
是的,你是對的,但問題是我正在使用高級功能,我無法控制,也沒有任何想法如何打開文件閱讀:FtpPutFile。 – user1581390 2012-08-09 13:50:32
然後將該函數自己的句柄賦予該文件。如果你需要文件處於一致狀態,你需要通過程序邏輯強制執行,可能使用互斥鎖,但很可能不是。 (一個資源被訪問時,一個互斥量應該暫時保持不變,而不是通過網絡I/O進行大量連續的I/O訪問。) – 2012-08-09 13:52:31
網絡I/O非常小。 FtpPutFile接收一個字符串,其中包含要上載的本地文件的路徑,而不是該文件的句柄。 – user1581390 2012-08-09 13:55:48
你試圖解決什麼問題?一個線程是否會弄亂另一個線程的文件位置? – 2012-08-09 13:04:08
請給我們更多的細節。更好的是,讀寫器代碼(或僞代碼)。現在不可能回答。 – atzz 2012-08-09 13:04:30
問題是在編寫器線程中打開文件時,FtpPutFile無法上載文件。 – user1581390 2012-08-09 13:47:07