1

C++ 0x11 (一種。Microsoft などすべて...)、Visual Studio 2010 SP1、Windows 7 Enterprise。

私は機能を持っています:

// typedef boost::variant</*stuff*/> value_t;
// typedef unsigned short key_t
// typedef std::map<key_t, value_t> map_t

value_t find(const key_t key, const map_t &map)
{
    const map_t::const_iterator iter(map.find(key));

    // ...More stuff and then return.
}

std::map::find の本体内に反復子の比較があり、VC\include\xtree:321 で定義されているように、「map/set iterators incompatible」というエラー メッセージが表示されます。このエラーの性質は、2 つの異なるコンテナーの反復子が互いに比較されていることですが、エラーはコンテナー自身の検索関数内から発生しています!!! 逆に、別のコンテナのイテレータはどこから来ている可能性がありますか。

わかりました、症状:

  • これスレッド化されたアプリケーションです。
  • これは、実際のアプリケーションのランダム化されたストレス テスト中に実行時にのみ発生します。
  • 無効または明らかなガベージ フィールドは見当たりません。

より大きなコミュニティへの私の質問:

これがスレッド化された環境でのタイミング エラーであると仮定すると、このプロセスの途中でマップの内部状態を変更すると、テンプレート クラス _Tree_const_iterator::_Getcont() の値が変更される可能性がありますか? このスレッドでの検索が完了する前に、マップがクリアされ、別のスレッドで再設定されていると思います。それだけでいいの?または、スワップまたは移動操作はどうですか?

欠落しているミューテックスロックなどを追跡します。このコンテキストを考慮して、この状態に入る可能性のあるすべてのもっともらしい手段を理解していることを確認したいだけです。

4

1 に答える 1

5

これがスレッド化された環境でのタイミング エラーであると仮定すると、

その後、すべての賭けはオフになります。コードがスレッド化されていてスレッド セーフでない場合、あらゆる種類のエラーが発生する可能性があります。std::mapはスレッドセーフではない (変更中はアクセスできない) ため、多くの種類のエラーが発生する可能性があります。

他の何かが間違っていると仮定する前に、コードがスレッドセーフであることを確認してください。

于 2012-08-29T23:03:40.780 に答える