c++ - 诊断互斥锁相关瓶颈的正确方法

标签 c++ profiling mutex

我正在开发一个共享数据结构(std::map)由多个线程读取和更新的应用程序。映射中的元素数量在初始化时是固定的,因此值经常变化但键不会。我使用由 Boost 提供的互斥锁和作用域锁来保护访问:

std::map<Key,Value> dataMap;
boost::mutex m;

void Set(Key k, Value v) {
  boost::scoped_lock sl(m);
  dataMap[k] = Value;
}

Value Get(Key k) {
  boost::scoped_lock sl(m);
  return dataMap[k];
}

我如何确定对 map 的访问是否存在瓶颈?在我看来,计算每种情况下获取互斥体需要多长时间是合乎逻辑的,例如

void Set(Key k, Value v) {
  Timer t; t.Start();
  boost::scoped_lock sl(m);
  t.Stop();
  cout << "Time taken to acquire mutex: " << t.Elapsed() << endl;
  dataMap[k] = Value;
}

我预计,当竞争较低时,平均花费的时间应该较低,而随着竞争的增加(例如,当有大量线程时),平均花费的时间将大大增加。

这是诊断互斥量访问是否存在瓶颈的有效方法吗?

如果没有,是否有任何开源程序可以正确执行类似的功能?

最佳答案

我不确定您的小测试使用什么,但如果您的程序增长,那么我可以推荐英特尔 Inspector 线程错误分析,它不是免费的,但我们发现它绝对值得。它有 30 天的免费试用期,我猜你可以下载它来运行一些 std::map 测试。

http://software.intel.com/en-us/intel-inspector-xe

关于c++ - 诊断互斥锁相关瓶颈的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824782/

相关文章:

c++ - 将互斥保护构建到 C++ 类中的线程安全方法?

c++ - c++中的开关中断故障怎么办?

c++ - 如何从 C++ 中的矩阵 (Mat) 返回特定值的索引?

c++ - 调整 NTL vector 的大小

.NET 代码分析工具

java - 有没有一种简单的方法来获取Java中特定类的所有对象实例

IE 中的 JavaScript 探查器

c - 在互斥锁内调用 sleep() 有什么缺点?

c++ - 添加十六进制值以获得结果十六进制

c++ - boost::scoped_lock 似乎没有锁定 std::cout