私はmap<uint, Order*> orders
を持っています。Orderは、id、time、price、volumeなどの適用可能なフィールドを持つ定義済みのクラスです。私はまた、下に定義されたマップの着信注文の追加と削除を待ち受けるスレッドを持っています。C++ map.erase()は不要なバランシングを引き起こします
void System::OrderDeleted_Thread(unsigned int order_id)
{
if(orders.find(order_id) != orders.end())
{
Order* order = orders[order_id];
orders.erase(order_id);
delete order;
}
}
私の問題はこれと非常に似ています
Segmentation fault in std function std::_Rb_tree_rebalance_for_erase()
私の質問は、私はそれを再する時間が来るとき私にエラーを与えてプログラムすることなく、私の命令マップを反復処理する方法であり、木のバランスをとる?リンクの解決策と同じように、私は.erase(uint)メソッドを取り出して動作させました。残念ながら、私は数万鍵の地図を保持することはできません。
ありがとうございます!
はあなたのスレッドの同期に関するいくつかの詳細を追加することができます - 特にあなたが別の削除はまた、あなたの制約が何であるか、一方のスレッドが読めるように行う、はほとんどのマシンのメモリ機能の範囲内にありますか? –
@TimGee私はスレッドの追加と削除を許可します。 1日を通じて、100k-200kのエントリを上回る可能性があります。キーで特定の注文を検索するには時間がかかりませんか? – Joshua
私はあなたの問題はスレッドの同期だと思うし、別の場所で回答されています。 100k〜200kマップのパフォーマンスコストについては、マップは対数ルックアップ性能を持つことに注意してください。英語では、このサイズの地図でさえ非常に高速です。 –