If the values are
std::atomic<>, you can modify and
read them from arbitrary threads, but you'll need to have saved
their addresses somehow - pointers, references or iterators - and
you'll need to know no other thread will call erase on them....
Still, even atomic values
won't make it safe to modify the container (e.g. inserting or
erasing elements), while other threads are also doing modifications
or lookups or iteration. Even the "const" functions - like size(),
empty(), begin(), end(), count(), and iterator movement - are
unsafe, because the mutating operations may be in the middle of
rewiring the inter-node links or updating the same data.
For anything more than the
above, you will need a mutex.