Are there better ways to erase elements from tbb::concurrent_hash_map than using keys? #1435
xamidi
started this conversation in
Design discussions
Replies: 1 comment
-
FYI @kboyarinov |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
I am looking for a good way to erase elements from a huge
tbb::concurrent_hash_map<std::string, std::string>
object.In an effort to replace
tbb::concurrent_unordered_map
bytbb::concurrent_hash_map
(because the former does not support concurrent modification of elements), I came across the issue thattbb::concurrent_hash_map
cannot erase elements via iterator, but only via accessor or key.But my keys are strings (more precisely, formulas that are conclusions of a proof given as the value) and I would prefer to not collect a lot of them to merely remember which are to be erased, because this may result in millions of long strings to pollute the memory.
My code concurrently iterates over
tbb::concurrent_hash_map<string, string> representativeProofs
in a specific way while not modifying it in order to find elements that should be removed, to then subsequently remove these elements.tbb::concurrent_unordered_map
, I simply used iterators. I found no guarantees fortbb::concurrent_hash_map
that iterators remain valid when other elements are removed, otherwise foriterator it
I could useerase(it->first)
(this still would require key-lookups, though).But somehow this results in undefined behavior. [Edit: Probably a lock around 'find()' would fix this?]
const_accessor
so thattoErase[&it->first]
can be avoided?erase(const_accessor)
faster thanerase(key)
,const_accessor
s remain valid while other elements are removed, andconst_iterator
s really invalidated upon erasure of other elements?I could not find a documentation stating which guarantees can be made on the validity of iterators and accessors after which operations.
Or a safe code example of how to best remove elements while or after iterating.
So far the only reliable method seems to be erasure by stored keys (i.e. many
erase(const string&)
here).But I suspect erasure via keys is also fine in parallel (in contrast, erasure is not thread-safe for
tbb::concurrent_unordered_map
).Is copying and using (a potentially huge number of) the keys really the one and only best method?
Beta Was this translation helpful? Give feedback.
All reactions