Yes, Iterators are a challenge even in single thread, as modifying the content can invalidate them. I recently coded to save an iterator, it++, erase saved iterator so I could continue using that iterator, a pain. It's hard to imagine a thread safe default behavior. I flash on watching the Oracle RDBMS oversight view have old pages tied to old queries in process and new pages for updated data in the tables supporting new queries. I am not sure the world is ready for an iterator that works on a deep copy of the entire container, or containers with internal versions!
What is the "classic" cure for iterators opened on a container that is subsequently modified?
But my proposal would allow simple synchronization of any class with no new code.
If we wanted to go crazy, we could support exclusive write and multiple read lock behaviors, with pending write blocking subsequent read, maybe triggered by const. That is tricky with methods that only conditionally modify -- they would get an exclusive write lock regardless!