首页 > 解决方案 > 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

看起来这个条目被某种方式锁定了,但没有人锁定它。

标签: c++findtbb

解决方案


推荐阅读