5

異なるプロセス/スレッドからファイルに同時にアクセスするとどうなりますか?ファイルをロックする標準的な方法はなく、OS固有の機能のみであることを理解しています。

私の場合、ファイルは頻繁に読み取られ、ほとんど書き込まれません。ここAで、読み取り用にファイルを開いて(ifstream)、チャンクの読み取りを開始した場合。そしてB、(ストリームの)書き込み用に同じファイルを開き、書き込みを開始します。何が起こるか?定義された動作はありますか?

編集 私の目標は、多くのファイルへの同時読み取り、書き込みアクセスです。ただし、書き込みアクセスはそれほど頻繁には発生しません。fstreamsがファイルの内容が混同されないことを保証すれば、私は満足するでしょう。

例:プロセス1と2がファイルAに書き込みます。同時に書き込む場合、ファイルの一貫したバージョンである限り、1または2のバージョンがディスクに書き込まれるかどうかは関係ありません。

プロセスがファイルを読み取り、同時に別のプロセスがファイルに書き込む場合、読み取りプロセスでファイルの「古い」バージョンを取得する必要があります。

fstreamがこれを処理しない場合は、データベースを使用します。

4

2 に答える 2

7

C++ を使用して (同時アクセスで) 効率的なファイル共有を行う移植可能な方法は確かにありません。

  1. 「ロック」ファイルを使用してファイルを共有できます。「foo.dat」を開く前に、ファイル「foo.lock」を作成してみてください。成功するまでループし続けます。アクセス後、foo.lockを削除してください。これにより、シリアル アクセスは許可されますが、同時アクセスは許可されません。

  2. プラットフォーム固有の方法でバイトレベルのロックを使用できます。Windows には LockFileEx() があります。POSIX には fcntl と flock があります。マルチプラットフォームが必要な場合は、個別の実装が必要になります。それらをクラスにカプセル化し、 #if を使用してプラットフォーム固有のビットを処理できます。これは非常に効率的 (最速) ですが、非常に複雑なプログラミングを伴い、バグが発生しやすくなります。

  3. DBMS を使用できます。

DBMS は非常に単純ですが、問題になる場合とそうでない場合がある外部製品に結び付けられます。バイト単位のロックは他のどのロックよりもはるかに高速ですが、開発とメンテナンスのコストが大幅に増加します。

于 2010-10-29T04:57:03.073 に答える
1

あなたの目標は何ですか?ファイルへの同時読み取り/書き込み操作を防止しようとしていますか、それともファイルを介して何らかの形式の IPC を実装したいですか?

いずれにせよ、Boost Interprocess を見てください。これにより、ファイル ロック (およびその他の IPC 用の優れた機能) を使用する機会が得られます。さらに、移植性があるという利点もあります。

于 2010-10-28T11:49:19.657 に答える