我正在开发一个应用程序,其中共享数据结构 (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;
}
我预计,当竞争低时,平均花费的时间应该很低,并且随着竞争的增加(例如当有大量线程时),平均花费的时间会大大增加。
这是诊断对互斥锁的访问是否是瓶颈的有效方法吗?
如果没有,是否有任何开源程序可以正确执行类似的功能?