For two threads manipulating a container map for example, what the correct way to test whether an iterator still valid (for performance reason) ?
Or would be of only indirect way that this can be done. The sample code for this :
#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; } }
std::maps are not at all thread-safe. You’ll end up with much worse problems than invalidated iterators, if you have more than one thread at a time modifying the same map. I don’t even think you have a guarantee that you can read anything out of a map while it’s being modified by another thread.Some pages on the STL and threading: