質問

こちらのもの:私は二つの用途では、C++で記述され、実機と異なるOS(LinuxとWindows)で作成しています。この工程は更新によるXMLファイルは、NAS(Network Attached Storage)から読み込みこのファイルです。

での同期をこの二つのプロセスを避けるために読書のファイルを同時にでています。

役に立ちましたか?

解決

書き込みを行う前に作成されたサーバー上にロックファイルを作成し、待機してから完了時に書き込みと削除を行います。ファイルを読み取る前に読み取りプロセスにトークンをチェックさせます。

編集:コメントに対処するために、二重チェックのロックタイプパターンを実装できます。作業を行う前に、リーダーとライターの両方にロックファイルを用意し、再確認してもらいます。

リーダー:書き込みロックファイルの確認、読み取りロックファイルの作成、書き込みロックファイルの確認、存在する場合は読み取りファイルを削除して中止します。

ライター:読み取りロックファイルの確認、書き込みロックファイルの作成、読み取りロックファイルの確認、存在する場合は書き込みロックファイルの削除と中止。

これにより、プロセスは相互に踏みつけられなくなりますが、潜在的な競合状態が発生する可能性があり、潜在的に両方のプロセスをチェック、作成、再チェックを同時に行うことができますが、これによりデータが矛盾した状態で読み込まれることはありませんが、読み取りと書き込みの両方のプロセスを指定した遅延で中断させます

他のヒント

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

ついに、OSのロックコマンドを使用することで(NASヘッドのOSに正しく伝播するかどうかわからなかったため)問題を解決できず、ロックファイルの代わりにロックディレクトリを作成しました。ディレクトリの作成はアトミック操作であり、フォルダーが既に存在する場合はエラー値を返します。したがって、ロックを取得する前にロックの存在を確認する必要はありません。両方の操作は単一のステップで行われます。

OKアクセスを制御するには何らかの形のロック機構が必要です。

ほとんどの* nixファイルシステムがこれを提供します。このメカニズムはperlで使用されているため、Windowsファイルシステムでも使用できると思われますが、別の名前が付いている可能性があります。

flock()を見てください。
これはファイルロックメカニズムです。これはアドバイザリロックであるため、実際にファイルをロックして使用を妨げることはありませんが、ファイルをマークするメカニズムを提供します。両方のアプリケーションがメカニズムを使用する場合、ファイルへのアクセスを制御できます。

flock()は、共有ロック(またはREADロック)と排他ロック(またはWRITEロック)の両方を提供します。 flockは、ユーザーがファイルのロックを解除するまでスレッドを(ビジーでない方法で)ブロックします(待機中に他のことを実行できるようにNONブロックチェックも提供します)。

manページのセクション2のflockをチェックしてください。

int     flock(int fd, int operation);

Flock() applies or removes an advisory lock on the file associated with the file
descriptor fd.  A lock is applied by specifying an operation parameter that is
one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB.  To unlock an
existing lock operation should be LOCK_UN.

の場合はファイルに居住し、NFSで共有できる利用 fcntl(2) ロックのファイルです。チェック問題 D10Linux NFS FAQ.私は非常に経験の少ないwindows Apiがら聞くといいPOSIX支援で対応することができるでしょう利用fcntlどの支援を行っていPOSIX.1-2001.

アにアクセスしている場合、ファイルを用いるプロトコルが異なっていると(AFSやSMB)かを設置することができ、簡単な同期をサーバーを管理するロックを介してIPCす

ファイルからデータベースに切り替えることは可能ですか?

このタイプの同時性は、DBMSが非常にうまく管理しているものです。高価である必要もインストールする必要もありません。 MySql、Postgress、またはJavaDBはすべて、ほとんどまたはまったくコストをかけずにこれをエレガントに処理します。

データベースオプションに失敗すると、書き込みプロセスに<!> quot; hidden <!> quot; <!> quot; .updateinprogress.xml <!> quotのようなファイル名;更新が完了したら、ファイルの名前を変更します。ほとんどのシステムでは<!> quot; mv <!> quot;または<!> quot; ren <!> quot;はアトミック操作であるため、読み取りプロセスは古いファイルまたは新しいファイルを取得しますが、半分は書き込まれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top