1

我正在开发一个应用程序,其中共享数据结构 (an 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;
}

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

这是诊断对互斥锁的访问是否是瓶颈的有效方法吗?

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

4

1 回答 1

0

我不确定你的小测试用什么,但如果你的程序在增长,那么我可以推荐 Intel Inspector Threading Error Analysis,它不是免费的,但我们发现它绝对值得。我猜它有一个 30 天的免费试用版,你可以下载它来运行一些 std::map 测试。

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

于 2013-07-24T04:02:15.730 回答