2017-07-20 1 views
0

Linux用のマルチスレッドアプリケーションで正しく機能する名前付きロックを作成する必要があります。アプリケーションの各インスタンスは、異なる名前の複数の名前付きロックを使用できます。Posixという名前のロックインタープロセスはマルチスレッドアプリケーションで動作しますか?

私は約fcntl/flockを知っていますが、1つのアプリケーションの異なるスレッドまたは1つのスレッドから2回ロックしようとすると動作しません。

私は約open(..., O_CREATE | O_EXCL)を知っていますが、信号KILLでアプリケーションが強制終了された場合、またはセグメンテーションフォルトでクラッシュした場合、このファイルロックは削除されず、再起動後にロックファイルを手動で削除する必要があります。

他の方法はありますか?

+0

もう少し詳しくお聞かせください。どのようにロックを実装したのいくつかのコードのスナップショット? – skr

+0

私は、マルチスレッドアプリケーションとアプリケーションの別のインスタンスで正しく動作する関数 'int lock(const char * name);と' int unlock(const char * name) 'を実装する必要があります。 スレッドまたはインスタンスアプリケーションが 'lock'を2回尋ねる場合、2回目の呼び出しは、リソースが' unlock'呼び出しでロック解除されない限り失敗します。 アプリケーションがクラッシュした場合、OSよりも 'unlock'関数が呼び出されたような動作を提供するはずです。 – knst

+0

これを処理する1つの方法は、セグメント化、KILLのような信号をキャプチャし、すべてのロックを解放して終了することです。 https://en.wikipedia.org/wiki/C_signal_handling – skr

答えて

0

最新のLinuxで実行する必要がある場合は、file-private locksを使用できます。これがオプションでない場合は、fcntlロックの上に独自のスレッドセーフロック抽象化を構築する必要があります。 SQLiteはパブリックドメインであり、これを実装しているので、インスピレーションのためにそれを見ることができます。 GPLedコードが大丈夫であれば、OpenJDKには、同じことの別の互換性のない実装があります。

O_EXCLは(ファイル作成ステップを超えて)ロックを実行しないため、通常は役に立ちません。

その他のオプションはSystem VとPOSIXセマフォですが、通常はプロセスの日にはfcntlのロックが機能しません。ファイルマッピングの堅牢でプロセス共有のミューテックスもオプションになる可能性がありますが、ディスクへのシリアライゼーションに関するPOSIXセマンティクスに留意する必要があります(基本的には、ミューテックスを毎回再初期化する必要があります。アプリケーションはリブートまたはlibcの更新後に最初から開始されます)。

関連する問題