4

私はC++でプログラムされたマルチスレッドアプリケーションに取り組んでいます。いくつかの一時ファイルを使用して、スレッド間でデータを渡します。1つのスレッドが、処理するデータをディレクトリ内のファイルに書き込みます。別のスレッドがディレクトリをスキャンして作業ファイルを探し、ファイルを読み取ってさらに処理してから、それらのファイルを削除します。これらのファイルを使用する必要があります。アプリが強制終了された場合、まだ処理されていないデータを保持する必要があるためです。

しかし、私は複数のファイルを使用するのが嫌いです。1つのファイルを使用したいだけです。1つのスレッドがファイルに継続的に書き込み、もう1つのスレッドがデータを読み取り、読み取られたデータを削除します。容器が上から満たされているように、下からデータを取得して削除することができます。これをC++で効率的に行う方法、最初に方法はありますか..?

4

3 に答える 3

3

あなたの質問へのコメントで示唆されたように、SQLiteのようなデータベースを使用することは非常に良い解決策かもしれません。ただし、ファイルの使用を主張する場合は、もちろんこれは可能です。

私は一度それを自分で行いました-ファイルを使用してディスク上に永続的なキューを作成しました。

これを実現する方法に関するガイドラインは次のとおりです。

  1. ファイルには、次の未処理のレコード(エントリ)と書き込み可能な次の場所を指すヘッダーが含まれている必要があります。
  2. レコードの長さが可変の場合、各レコードには、レコード長を示すヘッダーが含まれている必要があります。
  3. 各レコードに、レコードが処理されたかどうかを示すフラグを追加することをお勧めします
  4. ファイルロックを使用して、書き込み中のファイルの部分から誰も読み取らないようにすることができます
  5. 低レベルのIOを使用する-いかなる種類のバッファリングされたストリームも使用せず、直接書き込みセマンティクスを使用します

そして、これが読み取りと書き込みのスキームです(おそらくいくつかの小さな論理的なバグがありますが、そこからそれを取ることができるはずです):

読者

  1. ファイルヘッダーをロックして読み取り、ロックを解除して元に戻します
  2. 最後のレコード位置に移動します
  3. レコードヘッダーとレコードを読み取ります
  4. 処理済みフラグをオンにして、レコードヘッダーを書き戻します。
  5. ファイルの終わりにいない場合は、ヘッダーをロックし、次の未処理のレコードの新しい場所を書き込みます。それ以外の場合は、処理するレコードがこれ以上ないことを示すマーキングを書き込みます。
  6. 書き込む次のレコードが正しい場所を指していることを確認してください

また、リーダーにファイルをときどき圧縮してもらいたい場合もあります。

  1. ファイル全体をロックする
  2. すべての未処理のレコードをファイルの先頭にコピーします(未処理のレコードを上書きしないようにロジックを保持することをお勧めします-処理済みのスペースが未処理のスペースよりも大きい場合にのみコンパクトにすることができます)
  3. ヘッダーを更新します
  4. ファイルのロックを解除する

作家

  1. ファイルのヘッダーをロックし、次のレコードが書き込まれる場所を確認してから、ロックを解除します
  2. 書き込む場所からレコードの長さまでファイルをロックします
  3. レコードを書き込んでロックを解除します
  4. 未処理のレコードマークが処理するレコードがないことを示している場合はヘッダーをロックし、新しいレコードを指すようにしますヘッダーのロックを解除します

これが書き込みトラックにあなたを設定することを願っています

于 2012-11-10T19:24:58.433 に答える
2

win32Api関数CreateFileMapping()を使用すると、プロセスでデータを共有できます。複数のプロセスで、システムページングファイルに保存されているメモリマップトファイルを使用できます。

いくつかの良いリンク:

http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx

http://www.codeproject.com/Articles/34073/Inter-Process-Communication-IPC-Introduction-and-S

http://www.codeproject.com/Articles/19531/A-Wrapped-Class-of-Share-Memory

http://www.bogotobogo.com/cplusplus/multithreaded2C.php

于 2012-11-02T15:46:03.090 に答える
0

1行あたりの処理行であったデータを書き込むことができ、各行のデリメータは、このレコードが処理されているかどうかを示します

于 2014-07-01T11:21:14.660 に答える