Linux用のマルチスレッドアプリケーションで正しく機能する名前付きロックを作成する必要があります。アプリケーションの各インスタンスは、異なる名前の複数の名前付きロックを使用できます。Posixという名前のロックインタープロセスはマルチスレッドアプリケーションで動作しますか?
私は約fcntl
/flock
を知っていますが、1つのアプリケーションの異なるスレッドまたは1つのスレッドから2回ロックしようとすると動作しません。
私は約open(..., O_CREATE | O_EXCL)
を知っていますが、信号KILLでアプリケーションが強制終了された場合、またはセグメンテーションフォルトでクラッシュした場合、このファイルロックは削除されず、再起動後にロックファイルを手動で削除する必要があります。
他の方法はありますか?
もう少し詳しくお聞かせください。どのようにロックを実装したのいくつかのコードのスナップショット? – skr
私は、マルチスレッドアプリケーションとアプリケーションの別のインスタンスで正しく動作する関数 'int lock(const char * name);と' int unlock(const char * name) 'を実装する必要があります。 スレッドまたはインスタンスアプリケーションが 'lock'を2回尋ねる場合、2回目の呼び出しは、リソースが' unlock'呼び出しでロック解除されない限り失敗します。 アプリケーションがクラッシュした場合、OSよりも 'unlock'関数が呼び出されたような動作を提供するはずです。 – knst
これを処理する1つの方法は、セグメント化、KILLのような信号をキャプチャし、すべてのロックを解放して終了することです。 https://en.wikipedia.org/wiki/C_signal_handling – skr