0

私のプロジェクトでは、複数のスレッドからファイルを読み書きしているので、ファイルロックを実装する必要があります。私はfcntl()を試しましたが、その機能はスレッド間ではなく、プロセス間のロックでしか動作しないようです。このように、私は別の解決策を探しています。私が思いついた解決策(おそらくベストではないでしょう)は、レコードがロックされているかどうかを示すファイル内の各レコードに1バイトを持つことです。グランドセントラルディスパッチを使用してファイル領域ロックを効率的に実装するにはどうすればよいですか?

私は2つの質問があります。まず、ファイル領域のロックを実装する最も効率的な方法は何ですか?第二に、私がビジーループアプローチに踏み込んだ場合、どのようにして壮大な中央派遣でそれを最適化できますか?私は忙しいループのすべてをdispatch_sync()に送られたブロックで発生させることができると考えていました。しかし、それが効率的に機能するかどうかは分かりません。

ありがとうございました。

答えて

1

Dispatch Semaphore? Dispatch Semaphoreを使用すると、排他的にリソースにアクセスできます。たとえば、ファイル領域のディスパッチセマフォを作成します。

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

次に、waitとsignalでリソースにアクセスします。

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

問題は、各地域のメモリを割り当てる必要があることです。大容量のファイルになると、それは大量のメモリになります(ファイル内の各レコードには割り当てられたメモリが必要です)。セマフォーにレコードIDのマップを使用することができます。しかし、私はそのマップをロックするために単一のセマフォーを必要とするか、ボトルネックの原因となるアトミックリンクリストを実装します。 – Maz

+0

mmapが大きなファイルの問題を解決する可能性があります。あるいは、libsqlite3のようなデータベースライブラリが必要かもしれません。これは、大きなファイルに対してスレッドセーフなアクセスを提供します。 –

関連する問題