正确诊断互斥相关瓶颈的方法

时间:2013-07-24 03:36:11

标签: 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];
}

我如何确定对地图的访问是否是瓶颈?对于我来说,计算每种情况下获取互斥锁需要多长时间似乎是合乎逻辑的,例如

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;
}

我希望,当争用率较低时,平均花费的时间应该很短,并且随着争用的增加(例如,当线程数量很大时),平均花费的时间会大大增加。

这是诊断互斥锁是否成为瓶颈的有效方法吗?

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

1 个答案:

答案 0 :(得分:0)

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

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