簡體   English   中英

調用std :: map :: find時“映射/設置迭代器不兼容”

[英]“map/set iterators incompatible” while calling std::map::find

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的正文中,有一個迭代器比較,並且我得到了錯誤消息“ map / set迭代器不兼容”,如VC \\ include \\ xtree:321中所定義。 此錯誤的性質是,正在將來自兩個不同容器的迭代器相互比較,但該錯誤來自容器自身的find函數內部! 反過來,另一個容器的迭代器可能來自哪里。

好的,症狀:

  • 一個線程化的應用程序。
  • 它僅在運行時在實際應用程序的隨機壓力測試期間發生。
  • 我們沒有看到任何無效或明顯的垃圾字段。

我對廣大社區的提問:

假設這是線程環境中的計時錯誤,可以在此過程的中途更改映射的內部狀態,修改模板類_Tree_const_iterator :: _ Getcont()的值嗎? 我假設在此線程中的查找完成之前,正在另一個線程中清除並重新填充地圖。 單單能做到嗎? 或交換或移動操作如何?

我將查找丟失的互斥鎖或其他任何內容,我只想確保自己了解在給定上下文的情況下可以進入此狀態的所有可行方法。

假設這是線程環境中的計時錯誤

然后所有賭注都關閉了。 如果您的代碼是線程化的,並且不是線程安全的,那么您會遇到各種錯誤。 std::map不是線程安全的(修改后無法訪問它),因此您可能會遇到很多錯誤。

在假定其他錯誤之前,請確保您的代碼是線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM