parallel-hashmap: Multiple readers and writers under concurrent hash map not working.
Hello, I’m the guy who posted about the experiment on Reddit. https://www.reddit.com/r/cpp/comments/z6bn4n/my_own_concurrent_hash_map_picks/ Currently I’m using the if_countain_unsafe function with a lambda that atomically modifies a field of the "value.
Exception: EXC_BAD_ACCESS (code=1, address=0x0)
The call stack is:
std::equal_to::operator()(const unsigned long long &, const unsigned long long &) const operations.h:413 phmap::EqualTo::operator()(const unsigned long long &, const unsigned long long &) const phmap_base.h:79 phmap::priv::raw_hash_set::EqualElement::operator()<…>(const unsigned long long &, const std::piecewise_construct_t &, std::tuple<…> &&, std::tuple<…> &&) const phmap.h:1877 phmap::priv::memory_internal::DecomposePairImpl<…>(phmap::priv::raw_hash_set<…>::EqualElement<…> &&, std::pair<…>) phmap.h:751 phmap::priv::DecomposePair<…>(phmap::priv::raw_hash_set<…>::EqualElement<…> &&, std::pair<…> &) phmap.h:4122 phmap::priv::NodeHashMapPolicy::apply<…>(phmap::priv::raw_hash_set<…>::EqualElement<…> &&, std::pair<…> &) phmap.h:4357 phmap::priv::hash_policy_traits::apply<…>(phmap::priv::raw_hash_set<…>::EqualElement<…> &&, std::pair<…> &) phmap_base.h:518 phmap::priv::raw_hash_set::find_impl<…>(const unsigned long long &, unsigned long, unsigned long &) phmap.h:1843 phmap::priv::raw_hash_set::find_ptr<…>(const unsigned long long &, unsigned long) phmap.h:1750 phmap::priv::parallel_hash_set::find_ptr<…>(const unsigned long long &, unsigned long, phmap::LockableBaseImpl<…>::DoNothing &) phmap.h:3740 phmap::priv::parallel_hash_set::modify_if_impl<…>(const unsigned long long &, <lambda> &&) phmap.h:3256 phmap::priv::parallel_hash_set::if_contains_unsafe<…>(const unsigned long long &, <lambda> &&) const phmap.h:3238 Parallel_Node_Hashmap_Bench::reader(phmap::parallel_node_hash_map<…> (&)[4]) Parallel_Hashmap_Bench.hpp:48 decltype(static_cast<void (*>(fp)(static_cast<std::__1::reference_wrapper<phmap::parallel_node_hash_map<unsigned long long, Transaction_Table_Entry, phmap::Hash<unsigned long long>, phmap::EqualTo<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, Transaction_Table_Entry> >, 4ul, phmap::NullMutex> [4]>>(fp0))) std::__1::__invoke<void (*)(phmap::parallel_node_hash_map<unsigned long long, Transaction_Table_Entry, phmap::Hash<unsigned long long>, phmap::EqualTo<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, Transaction_Table_Entry> >, 4ul, phmap::NullMutex> (&) [4]), std::__1::reference_wrapper<phmap::parallel_node_hash_map<unsigned long long, Transaction_Table_Entry, phmap::Hash<unsigned long long>, phmap::EqualTo<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, Transaction_Table_Entry> >, 4ul, phmap::NullMutex> [4]> >(void (*&&)(phmap::parallel_node_hash_map<unsigned long long, Transaction_Table_Entry, phmap::Hash<unsigned long long>, phmap::EqualTo<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, Transaction_Table_Entry> >, 4ul, phmap::NullMutex> (&) [4]), std::__1::reference_wrapper<phmap::parallel_node_hash_map<unsigned long long, Transaction_Table_Entry, phmap::Hash<unsigned long long>, phmap::EqualTo<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, Transaction_Table_Entry> >, 4ul, phmap::NullMutex> [4]>&&) type_traits:3918 std::__thread_execute<…>(std::tuple<…> &, std::__tuple_indices<…>) thread:287 std::__thread_proxy<…>(void *) thread:298 <unknown> 0x000000019405206c
I have attached my code. I think the code itself is fairly simple and straightforward. Hope to hear back from you some time later. Thanks so much!
Concurrent Hash Map Test.zip
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 26 (13 by maintainers)
Thank you. Haha I made a mistake in my code. I should forget the case that if_contains does not even get executed. My bad.
Thank you! You helped me a lot. I will later also do a benchmark on the flat hash map and let you know if I find anything interesting.