2013-03-25 50 views
0

是存在的,在Windows上,任何簡單的方法來鎖定一個獨特的方式文件(閱讀和寫作爲我的軟件)在多線程C代碼?我試過了LockFileEx,但它只能在進程之間而不是在線程之間(同一進程)。ç窗口多線程文件鎖定

注意:我的問題是我創建了一個小文件服務器(多線程),當文件發出請求時,一個「A」必須獨佔訪問請求的「file1.txt」,但如果另一個線程「B」想要相同的「file1.txt」,它必須等待之前使用此文件。如果線程「A」使用的CreateFile()與dwSharedMode爲「0」打開/創建「FILE1.TXT」,確保只有它讀取或打開這個文件,如果線程「B」試圖打開「文件1發生錯誤逸岸。文本」。現在線程「B」如何等待「file1.txt」?

+0

我認爲,你應該知道你的線程在做什麼,並實現自己鎖定(帶有[互斥(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411(V = vs.85).aspx),例如)。 – 2013-03-25 02:55:56

+0

看看Aniket的答案。文件鎖定比互斥鎖或線程鎖定更加棘手。它也適用於集羣服務器或共享驅動器。例如,在兩臺不同的計算機上運行的小型服務器正在使用相同的目錄和文件。 – TamusJRoyce 2014-04-23 18:32:28

回答

1

您可以通過在CreateFile()函數中將dwShareMode設置爲0來以獨佔模式打開文件。

在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363874(v=vs.85).aspx

+0

注:我的問題是,我做了一個小文件服務器(多線程),當一個文件的請求到來時,一個thred「A」必須以獨佔方式來請求「FILE1.TXT」存取權限,但是如果另一個線程「B」想要使用此文件之前必須等待的相同「file1.txt」。如果線程「A」使用的CreateFile()與dwSharedMode爲「0」打開/創建「FILE1.TXT」,確保只有它讀取或打開這個文件,如果線程「B」試圖打開「文件1發生錯誤逸岸。文本」。現在線程「B」如何等待「file1.txt」? – user2199646 2013-03-25 15:21:29

+0

文件本質上是線程安全的。試着打開文件。如果文件上有獨佔鎖定,則等待。那是你的儲物櫃。它保證原子,跨線程或跨進程。 – TamusJRoyce 2014-04-23 18:28:34

0

Slim Reader/Writer (SRW) Locks

SRW鎖提供其中線程能夠訪問共享資源的兩個模式:

  • 共享模式,授予共享的只讀訪問多個閱讀器線程,這使他們能夠從共享資源中同時讀取數據。如果讀取操作超過寫入操作,則與關鍵部分相比,此併發性可提高性能和吞吐量。

  • 獨佔模式,它一次授予對一個寫入器線程的讀/寫訪問權限。當以獨佔模式獲取鎖定時,除非寫入程序釋放鎖定,否則其他線程無法訪問共享資源。

1

我理解你作爲一個如下的問題:如何組織對資源的訪問(文件)mutliply線程(讀者 - 作者問題應該得到解決)

如果您資源應該amoung同一進程內運行的線程共享:
使用同步原語critical_section(它比系統對象同步原語更有效,但只適用於同一個進程中的線程一起)
否則使用mutex;