2013-07-24 27 views
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; 
} 

我想到的是,當存在低的爭用,應該低所需的平均時間,和作爲競爭的增加(例如,當存在大量線程),所用的平均時間也會大大增加。

這是診斷互斥體訪問是否是瓶頸的有效方法?

如果不是,是否有任何開源的程序能夠正確執行類似的功能?

+0

GPROF通常適合我要分析和顯示我什麼功能的時間最長。雖然我沒有用過很多其他的東西來比較。所以別人可以有更好的意見。 – CBIII

回答

0

我不確定如何使用您的小測試,但如果您的程序增長,那麼我可以推薦英特爾Inspector線程錯誤分析,它不是免費的,但我們發現它絕對值得。它有一個30天的免費試用版,你可以下載運行一些std :: map測試。

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