4

ライターバイアスのリーダー/ライターモデルで2つ(またはそれ以上)のプロセス間でデータのチャンクを効果的に共有するための最良の方法を探しています。

私の現在のテストはboost::interprocessです。いくつか作成managed_shared_memoryし、共有メモリに格納されているプロセス間ミューテックスを使用して、データチャンクへのアクセスをロックしようとしています。

ただし、sharable_lockリーダーとupgradable_lockライターで使用している場合でも、クライアントは書き込み操作中にフラグメント化された値をブロックする代わりに読み取ります。単一のプロセスでスレッド間で同様のリーダー/ライターのセットアップを行っている間、私はupgrade_to_unique_lockこの問題を解決するために使用しました。しかし、私はそれにboost::interprocess相当するものを見つけていません。存在しますか?

サーバー(ライター):

while (1) {
  // Get upgrade lock on the mutex
  upgradable_lock <MutexType> lock(myMutex);

  // Need 'upgrade_to_unique_lock' here so shared readers will block until
  // write operation is finished.

  // Write values here
}

クライアント(リーダー)

while (1)
{
  // Get shared access
  sharable_lock <MutexType> lock(myMutex);

  // Read p1's data here -- occasionally invalid!
}

手元にあるより大きな問題はこれだと思います。プロセス間ミューテックスは、ライターに偏ったセットアップでプロセス間の共有メモリにアクセスするための適切な方法でさえありますか?

注:Boost1.44.0を使用する

4

2 に答える 2

3

すべての Boost.Interprocess アップグレード可能なロックは、これによるアップグレードをサポートしますここでの定義。

あなたのより広い質問について - これはまさにあなたが望むものだと思います。リーダーは引き続き同時に動作する可能性があり、同時書き込みを防止する必要があります。より制限されたアクセスが保証されるように共有メモリを分割できない限り、これが最適に見えます。

于 2010-11-11T18:34:37.870 に答える