1
我正在研究共享數據結構(std::map
)同時被多個線程讀取和更新的應用程序。映射中元素的數量在初始化時是固定的,因此值經常變化,但鍵不變。我使用的是互斥和範圍的鎖,由升壓都提供,以保護訪問:診斷互斥鎖相關瓶頸的正確方法
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;
}
我想到的是,當存在低的爭用,應該低所需的平均時間,和作爲競爭的增加(例如,當存在大量線程),所用的平均時間也會大大增加。
這是診斷互斥體訪問是否是瓶頸的有效方法?
如果不是,是否有任何開源的程序能夠正確執行類似的功能?
GPROF通常適合我要分析和顯示我什麼功能的時間最長。雖然我沒有用過很多其他的東西來比較。所以別人可以有更好的意見。 – CBIII