2012-01-13 34 views
0

私は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)メソッドを取り出して動作させました。残念ながら、私は数万鍵の地図を保持することはできません。

ありがとうございます!

+0

はあなたのスレッドの同期に関するいくつかの詳細を追加することができます - 特にあなたが別の削除はまた、あなたの制約が何であるか、一方のスレッドが読めるように行う、はほとんどのマシンのメモリ機能の範囲内にありますか? –

+0

@TimGee私はスレッドの追加と削除を許可します。 1日を通じて、100k-200kのエントリを上回る可能性があります。キーで特定の注文を検索するには時間がかかりませんか? – Joshua

+0

私はあなたの問題はスレッドの同期だと思うし、別の場所で回答されています。 100k〜200kマップのパフォーマンスコストについては、マップは対数ルックアップ性能を持つことに注意してください。英語では、このサイズの地図でさえ非常に高速です。 –

答えて

4

私はまた、下に定義されたマップの着信注文の追加と削除を待ち受けるスレッドを持っています。

マップへのアクセスを同期する必要があります。 STLコンテナは、何らかの外部同期なしでは、複数のライターでスレッドセーフではありません(また、消去要素がコンテナに書き込んでいます)。

+0

私はorders.erase(order_id)行の周りにミューテックスを追加しましたが、それでも同じ問題を抱えています...これはあなたが参照しているものではありませんか? – Joshua

+0

@Joshua、別のスレッドからマップを変更する場合は、そのマップを使用するたびにそのミューテックスを使用する必要があります。 – MSN

+0

イレーズだけでなく、反復を含む*すべての操作を同期させて検索する必要があります。 –

1

追加データと削除データを別々のデータ構造でキューに入れ、安全な時間に処理します。つまり、マップを反復処理しないことが保証されています。その安全な時間は、あなたのプログラムに応じてマップを保護するミューテックスなどを取得した後でもかまいません。

0

同期の問題とは別に、これはループを書くコストのかかる方法です。代わりに、これを試してみてください?

std::map<uint, Order*>::iterator it; 
Order * p = NULL; 

{ // enter critical section 
    if ((it = orders.find(id)) != orders.end()) 
    { 
     p = it->second; 
     orders.erase(it); 
    } 
} // leave critical section 

delete p; 
+0

真実ですが、実際にはOPの質問には答えません。 –

+0

@BillyONeal:True ...もっとコードを見ることなくOPの問題を解決できるとは思いません。私の賭けは同期の問題であり、私の答えは同期ソリューションのコストを下げます。何か価値があるならば:-S(実際に少し改善を加えました)。 –

+0

@KerrekSBありがとう、なぜそれが安いのか説明できますか?そのイテレータが存在するかどうかを確認するだけでなく、[]演算子を使用して取得するのですか? – Joshua

関連する問題