我正在开发一个应用程序,其中共享数据结构(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;
}
我希望,当争用率较低时,平均花费的时间应该很短,并且随着争用的增加(例如,当线程数量很大时),平均花费的时间会大大增加。
这是诊断互斥锁是否成为瓶颈的有效方法吗?
如果没有,是否有正确执行类似功能的开源程序?
答案 0 :(得分:0)
我不确定您的小测试会使用什么,但如果您的程序增长,那么我可以推荐英特尔Inspector线程错误分析,它不是免费的,但我们已经发现它绝对值得。它有一个30天的免费试用版,您可以下载它来运行一些std :: map测试。