3

1std::map < std::string, std::string > つのスレッドから不規則な間隔で値が追加され(ただし、頻繁に実行され、非常に高速である必要があります)、エントリのグループが削除されることがあります。

別のスレッドから、マップのスナップショットをテキストとしてユーザーからのデバッグログオンコマンドにダンプする必要があります。

明らかに、更新可能である間にデバッグ情報を出力するマップを反復処理することはスレッドセーフではないため、データをダンプする前に読み取りロック(mutex)を取得し、挿入または削除ごとに書き込みロックを使用しています。これは問題なく機能しますが、マップをこれほど長くロックすることはできません。受信した更新の処理が大幅に遅れます。

他のスレッドからマップを変更するとイテレータが無効になる可能性があるため、各アイテムのデバッグダンプスレッドをロックおよびロック解除できるとは思いません。

新しい値をすばやく挿入できるように、データ構造全体の読み取りロックを解除せずに安全にこれを実行できる方法はありますか?反復中に値を追加および削除できる場合、データの一貫したビューを保証することはできませんが、安全である限り、それは理解できます。

これにマップを使用する方法がない場合、誰かが私が使用できる他のデータ構造を提案できますか?

編集:アイテムを追加するときに高価なロックを解除する必要がないことを意味する解決策を望んでいます。

4

1 に答える 1

5

私が現時点で見ることができる2つの解決策があります:

  1. (簡単ですが、それでも時間がかかりすぎる可能性があります):ロックされている間にマップをコピー(または別のコンテナーに割り当てる)してから、ロックされていないときにローカルコピーをデバッグログにダンプします
  2. (もう少し作業):マップの更新をキューを介して別のスレッドに委任します。他のスレッドがデバッグログにダンプするスレッドである場合、ロックはもう必要ありません。このように、高速スレッドはキューにアクセスしている間のみロックされます。
于 2012-08-07T14:14:52.830 に答える