c++ - C++ TBB concurrent_hash_map:查找/擦除方法卡住了我的程序
问题描述
我是英特尔 TBB 库的新手。我正在使用 concurrent_hash_map。
当我调用查找/擦除方法时,我的程序卡住了。为什么?
使用 find 是错误的吗?
TBBProcessingThreadHash_t::accessor tbbAccessor;
std::cout << "size before erase is: " << m_oProcessingThreadHash.size() << std::endl; // return 1
std::cout << "going to find" << std::endl;
if(m_oProcessingThreadHash.find(tbbAccessor, pi_nThreadID)) // <<<<<<<<<<< stuck at this point
{
std::cout << "going to erase" << std::endl;
m_oProcessingThreadHash.erase(tbbAccessor);
std::cout << "Thread deleted successfully from CServerThreadManager" << std::endl;
}
else
{
std::cout << "Failed to delete thread from CServerThreadManager" << std::endl;
}
我使用了 perf top,这是我的程序的结果:
23.40% libServer.so [.] __TBB_machine_pause
22.81% libc-2.27.so [.] __sched_yield
15.07% [kernel] [k] do_syscall_64
13.95% [kernel] [k] __sched_text_start
2.23% libServer.so [.] tbb::spin_rw_mutex_v3::scoped_lock::try_acquire
1.86% libServer.so [.] tbb::internal::atomic_backoff::bounded_pause
1.43% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::lookup
1.28% libServer.so [.] __TBB_machine_fetchadd8
1.17% [kernel] [k] exit_to_usermode_loop
0.99% libtbb.so.2 [.] tbb::spin_rw_mutex_v3::internal_acquire_reader
0.97% libServer.so [.] tbb::spin_rw_mutex_v3::scoped_lock::release
0.75% libServer.so [.] tbb::internal::__TBB_machine_atomic_load<long, 2>
0.74% prog [.] tbb::internal::no_copy::no_copy
0.72% [kernel] [k] sys_sched_yield
0.66% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::search_bu
0.64% libServer.so [.] tbb::interface5::internal::hash_map_base::get_bucket
0.57% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::bucket_ac
0.56% libServer.so [.] tbb::spin_rw_mutex_v3::scoped_lock::acquire
0.52% libServer.so [.] tbb::tbb_hash_compare<int>::equal
0.51% libServer.so [.] tbb::internal::__TBB_machine_atomic_load<tbb::interface5::internal::hash_map_node_base*, 2>
0.48% libServer.so [.] tbb::internal::atomic_impl<unsigned long>::to_bits_ref<unsigned long const volatile>
0.46% libServer.so [.] tbb::internal::atomic_impl<unsigned long>::to_value<unsigned long>
0.44% libServer.so [.] tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock
0.42% libtbb.so.2 [.] tbb::spin_rw_mutex_v3::internal_try_acquire_writer
0.41% libServer.so [.] tbb::internal::itt_load_word_with_acquire<unsigned long>
0.39% libServer.so [.] tbb::internal::atomic_backoff::atomic_backoff
0.38% prog [.] tbb::interface5::internal::hash_map_base::segment_base
0.37% libServer.so [.] tbb::internal::atomic_impl<unsigned long>::operator unsigned long
0.35% libServer.so [.] tbb::internal::__TBB_load_with_acquire<tbb::interface5::internal::hash_map_node_base*>
0.32% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::bucket_ac
0.31% libServer.so [.] tbb::interface5::internal::hash_map_base::is_valid
0.28% libServer.so [.] tbb::internal::atomic_backoff::pause
0.28% libServer.so [.] tbb::internal::itt_load_word_with_acquire<tbb::interface5::internal::hash_map_node_base*>
0.24% libServer.so [.] tbb::interface5::internal::hash_map_base::segment_index_of
0.24% libServer.so [.] __TBB_machine_lg
0.23% libServer.so [.] tbb::internal::gcc_builtins::clz
0.23% libServer.so [.] tbb::internal::machine_load_store<long, 8ul>::load_with_acquire
0.23% libServer.so [.] tbb::internal::__TBB_load_with_acquire<long>
0.23% libServer.so [.] tbb::internal::machine_load_store<tbb::interface5::internal::hash_map_node_base*, 8ul>::load_with_acquire
0.23% libServer.so [.] tbb::aligned_space<std::pair<int const, IServerProcessingThread*>, 1ul>::begin
0.22% libServer.so [.] tbb::internal::punned_cast<std::pair<int const, IServerProcessingThread*>*, tbb::aligned_space<std::pair<int const, IServerProcessingThread*>, 1ul> const>
0.21% libServer.so [.] tbb::internal::atomic_impl<unsigned long>::ptr_converter<unsigned long const volatile*>::ptr_converter
0.20% libServer.so [.] tbb::spin_rw_mutex_v3::scoped_lock::~scoped_lock
0.18% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::node::sto
0.17% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::bucket_ac
0.15% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::node::val
0.13% prog [.] tbb::internal::no_assign::no_assign
0.12% libServer.so [.] tbb::interface5::concurrent_hash_map<int, IServerProcessingThread*, tbb::tbb_hash_compare<int>, tbb::tbb_allocator<std::pair<int const, IServerProcessingThread*> > >::bucket_ac
0.09% [kernel] [k] __softirqentry_text_start
0.08% libServer.so [.] tbb::spin_rw_mutex_v3::scoped_lock::acquire@plt
看起来这个条目被某种方式锁定了,但没有人锁定它。
解决方案
推荐阅读
- haskell - 是否可以为 haskell 脚本指定一个 `stack.yaml` 文件?
- java - 在 Web 提示符下登录 - Selenium 和 Java
- python - Python - linalg.eigsh 如何找到*所有*特征向量?
- json - 我怎样才能改进原始 JSON 数据以便使用它?
- r - 用solve.QP解决一个几乎二次问题
- python - 按列号选择 SQLite
- c# - 你如何模拟 ILogger LogInformation
- mysql - 如何使用带有 EOF 的 BASH 修复 MySQL 8 中引号内的双/单引号?
- matlab - 在矢量化函数中调用模式搜索
- eclipse - Eclipse RCP 新插件依赖未解决需求