有没有办法检查迭代器是否有效?

lsa*_*mon 3 c++ performance iterator stl

例如,对于操作容器映射的两个线程,测试迭代器是否仍然有效的正确方法是什么(出于性能原因)?
或者只是间接的方式可以做到这一点.这个示例代码:

#define _SECURE_SCL 1
//http://msdn2.microsoft.com/en-us/library/aa985973.aspx
#define _SECURE_SCL_THROWS 1

#include "map"
#include "string"
#include "exception"
#include "iostream"

using namespace std;

void main(void)
{
    map<string, string> map_test;
    map<string, string>::iterator iter_map_test;

    map_test [ "AAAAA" ] = "11111";
    map_test [ "BBBBB" ] = "22222";
    map_test [ "CCCCC" ] = "33333";

    iter_map_test = map_test.find ("BBBBB");

    map_test.erase ("BBBBB");

    try
    {
        string value = (*iter_map_test).second;
    }
    catch ( exception & e )
    {
            cout << e.what() << endl;
    }
    catch ( ... )
    {
            cout << "generic exception." << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ecl*_*pse 9

std::maps根本不是线程安全的.如果一次有多个线程修改同一个映射,那么最终会遇到比失效迭代器更糟糕的问题.我甚至认为你无法保证在被另一个线程修改时你可以从地图中读取任何内容.

STL和线程上的一些页面: