TBB 의 concurrent container 들은 쓰레드 안전할 것 같은 이름을 가졌지만 method 마다 쓰레드 안전성이 다를 수 있다.
concurrent_unordered_map 은 insert, lookup, traversal 은 동시에 할 수 있으나 erase 는 쓰레드 안전하지 않다.
http://egloos.zum.com/sweeper/v/3053901
안전하지 않은 method 들은 unsafe_erase 처럼 unsafe 가 붙어 있다. clear, swap 도 unsafe 하다.
insert, lookup, traversal 이 안전하다고 해서 그 값을 동시에 접근해서 읽고 쓰는게 안전하다는 것도 아니다. 만약에 std::shared_ptr 같은 구조체를 사용한다면 c++ 20 이전에는 atomic_store, atomic_load 를 사용하고 c++ 20 부터는 atomic_shared_ptr 을 사용해야 한다.
boost::shared_ptr 같은 구조체를 사용한다면 차라리 accessor 라는 것을 통해 동시 접근 제어를 할 수 있는 concurrent_hash_map 을 사용하는 것도 방법이다. accessor 는 rw, const_accessor 는 r 접근할 때 사용한다. accessor 는 atomic 구조체로 구현된 spin_rw_mutex 를 이용해 bucket 접근을 제어한다.
https://oneapi-src.github.io/oneTBB/main/tbb_userguide/concurrent_hash_map.html
http://egloos.zum.com/sweeper/v/3053914