2012-08-09 95 views
0

我有兩個線程,一個寫入文件,一個讀取同一個文件。 我使用CreateFile & WriteFile,寫入器線程中的FlushFileBuffers,並且讀取器線程使用FtpPutFile。C++/Win32重疊文件讀/寫訪問:我應該使用Mutex還是什麼?

如何在這裏實現一個簡單的windows32互斥鎖? (我多年沒有用過)

或者,這是否有可能將正確的標誌發送到CreateFile? (我試過,但沒有運氣)

+0

你試圖解決什麼問題?一個線程是否會弄亂另一個線程的文件位置? – 2012-08-09 13:04:08

+1

請給我們更多的細節。更好的是,讀寫器代碼(或僞代碼)。現在不可能回答。 – atzz 2012-08-09 13:04:30

+0

問題是在編寫器線程中打開文件時,FtpPutFile無法上載文件。 – user1581390 2012-08-09 13:47:07

回答

0

如何實現一個簡單的互斥:
創建與CreateMutex功能或CreateMutexEx互斥。完成後您需要撥打CloseHandle。一旦你的互斥體,那麼你可以調用WaitForSingleObject同步您的來電(不要忘記調用ReleaseMutex當你做。最後,這裏是使用互斥對象的example

+0

謝謝!這答案的一半。 – user1581390 2012-08-09 13:52:30

+0

@ user1581390 - 請注意David的評論,儘量減少持有鎖的時間。 – pstrjds 2012-08-09 14:00:00

+0

已經做到了。事情是我想優化exe的大小,我寧願不添加任何更多的#includes或使用互斥,除非我絕對必須這樣做。 – user1581390 2012-08-09 14:07:20

1

你並不需要一個互斥。您可以安全地讀取和寫入多個線程中的同一個文件。您可以多次打開文件,以便每個線程都有自己的文件句柄,因此具有自己的文件指針,或者可以使用重疊的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並擔心另一個線程搞亂了指針。同樣的東西適用於寫作。

+0

是的,你是對的,但問題是我正在使用高級功能,我無法控制,也沒有任何想法如何打開文件閱讀:FtpPutFile。 – user1581390 2012-08-09 13:50:32

+1

然後將該函數自己的句柄賦予該文件。如果你需要文件處於一致狀態,你需要通過程序邏輯強制執行,可能使用互斥鎖,但很可能不是。 (一個資源被訪問時,一個互斥量應該暫時保持不變,而不是通過網絡I/O進行大量連續的I/O訪問。) – 2012-08-09 13:52:31

+0

網絡I/O非常小。 FtpPutFile接收一個字符串,其中包含要上載的本地文件的路徑,而不是該文件的句柄。 – user1581390 2012-08-09 13:55:48

相關問題