0

對於我的項目,我正在從多個線程讀取和寫入文件,所以我需要實現文件鎖定。我試過fcntl(),但是它似乎只能在進程之間鎖定,而不是在線程之間鎖定。因此,我正在尋找另一種解決方案。我提出的解決方案(可能不是最好的)是在我的文件中的每個記錄中都有一個字節來指示記錄是否被鎖定,然後我可以使用繁忙循環來讀取和檢查字節。如何高效地實現使用宏中央調度的文件區域鎖定?

所以,我有兩個問題。首先,實現文件區域鎖定的最有效方法是什麼?其次,如果我採用繁忙循環方法,那麼如何通過大中央調度來優化?我在想,我可以讓所有的忙碌循環發生在發送到dispatch_sync()的塊中。但我不知道這是否能夠有效地發揮作用。

謝謝。

回答

1

Dispatch Semaphore怎麼樣?您可以使用Dispatch Semaphore來訪問專門的資源。例如,爲您的文件區域創建Dispatch Semaphores。

for (int i = 0; i < regions; ++i) 
    sema_[i] = dispatch_semaphore_create(1); 

然後,用等待和信號訪問資源。

dispatch_semaphore_wait(sema_[region], DISPATCH_TIME_FOREVER); 
/* access the region */ 
dispatch_semaphore_signal(sema_[region]); 
+0

問題是,那麼我必須爲每個區域分配內存。一旦它成爲一個大文件,那就是很多內存(因爲文件中的每個記錄都需要分配內存)。我可以使用記錄ID映射信號。但是,我需要一個單一的信號量來鎖定該映射,或者實現一個會導致瓶頸的原子鏈表。 – Maz

+0

mmap可能會解決大文件問題。或者你可能想要像libsqlite3這樣的數據庫庫。它爲大文件提供線程安全訪問。 –

相關問題