複数のスレッドが同じファイルへの排他的アクセスを必要とする可能性があるマルチスレッドアプリケーションに取り組んでいます。これらの操作をシリアル化する方法を探しています。flock、lockf、またはfcntlロックを使用することを計画していました。ただし、これらのメソッドでは、2つのスレッドが同じプロセスにあるため、最初のスレッドがすでにロックを所有しているときに2番目のスレッドでファイルをロックする試みが許可されるようです。これは、flockとfnctlのマンページによるものです(Linuxではlockfはfnctlで実装されていると思います)。この他の質問でもサポートされています。それで、プロセスレベルではなくスレッドレベルで機能するLinuxでファイルをロックする他の方法はありますか?
私が思いついた、好きではないいくつかの選択肢は次のとおりです。
1)O_CREAT |で開かれたロックファイル(xxx.lock)を使用します。O_EXCLフラグ。競合がある場合、この呼び出しは1つのスレッドでのみ成功します。これに伴う問題は、他のスレッドがロックを達成するまで呼び出しをスピンする必要があることです。つまり、_yield()またはsleep()を実行する必要があるため、これは優れたオプションではないと思います。
2)開いているすべてのファイルのミューテックスリストを保持します。スレッドがファイルを開いたり閉じたりする場合は、最初にリストをロックする必要があります。ファイルを開くと、リストを検索して開いているかどうかを確認します。ファイルがまだ所有されていない場合でも、かなりの量の作業が必要になるため、これは特に非効率に聞こえます。
これを行う他の方法はありますか?
編集: オンラインのマニュアルページにはないシステムのマニュアルページでこのテキストを見つけました:
プロセスがopen(2)(または同様のもの)を使用して同じファイルに対して複数の記述子を取得する場合、これらの記述子はflock()によって個別に処理されます。これらのファイル記述子の1つを使用してファイルをロックしようとすると、呼び出し元のプロセスが別の記述子を介してすでに設定しているロックによって拒否される場合があります。
「拒否されるかもしれない」という言葉には満足していません。「拒否される」のが好きですが、それをテストする時が来たと思います。