2013-02-27 71 views
1

環境:WINDOWS 7.0,C++,多線程多線程與多重映射

我創建了一個新的工作線程接收插座上的數據,並將其添加到一個靜態multimap實例。

代碼片段:

//remember mymultimap is static data type 
static std::multimap<string,string> mymultimap; 
EnterCriticalSection(&m_criticalsection); 
mymultimap.insert ("aaa", "bbb")); 
LeaveCriticalSection(&m_criticalsection); 

在同一時間我的主線程讀取相同的靜態多重映射: 代碼卡:

EnterCriticalSection(&m_criticalsection); 
std::multimap<string,string>::iterator it = mymultimap.begin(); 
for(; it != mymultimap.end(); it++) 
{ 
std::string firstName = (*it).first; 
std::string secondName = (*it).second; 
} 
LeaveCriticalSection(&m_criticalsection); 

作爲主要工作線程汽車無做讀寫,它妨礙了我的應用程序性能。 multimap的實例還包含大量數據(超過10,000條記錄)。

如何在multimap中使線程鎖定時間最短?

EnterCriticalSection(&m_criticalsection); 
///minimal lock time for Map ??? 
LeaveCriticalSection(&m_criticalsection); 

請幫我提高我的應用程序性能。

+1

根據您在循環中執行的操作,您可以將數據複製到第二個集合,然後在離開臨界區之後對副本執行(可能)冗長的操作。 – 2013-02-27 13:10:35

回答

1

因爲它的問題留下了太多的討論空間:我們不知道如何實際使用multimap中存儲的值。

如果:

  • 在數據結構實施的順序很重要,
  • 你需要保持在多重映射值,他們已經閱讀後,也
  • 你需要去通過所有每次你讀的條目,

那麼你幾乎堅持如何優化使用該結構。另一方面,如果您可以以某種方式放鬆其中一項要求,那麼您可能會優化一些東西,例如通過使用消息隊列而不是直接用於兩個線程之間的通信。

消息隊列是實現線程間高效通信的標準方式,對於一對一安裝,甚至有無鎖解決方案。

更新:考慮一下,在線程中共享這種類型的結構並不是一個好主意,不管你使用它。最好在單個線程中重新組合所有對multimap的訪問,並將其他線程生成的項傳遞給通過隊列管理它的線程。這完全分離了從存儲和使用中生成物品的工作。在你的情況下,生產者線程將丟失更少的時間存儲數據,這使得處理套接字流更多的時間。

因此,對於該解決方案,您需要(例如std::queue),以便在初始化時處理這兩個線程,或者像multimap那樣處理靜態實例。然後,簡單地將第一個線程中的multimap::insert替換爲make_pair(key, value)queue::push_back,並在消費者線程中對稱地更新隊列中的所有掛起對,並將它們同時插入到映射中,然後執行處理你的地圖,不管它是什麼。

注:

請注意,如果您使用的是多重映射,你可能最終得到了相同的密鑰多個值:調用find將返回一個迭代器,你很可能要檢查multimap的下一個條目,以確保您獲得具有相同鍵的所有值。

+0

在主線程循環中,我讀取特定鍵的MultiMap的值。我可以這樣做主線程嗎? EnterCriticalSection(&m_criticalsection); std :: multimap :: iterator it = mymultimap.begin(); LeaveCriticalSection(&m_criticalsection); – sandy 2013-02-27 13:24:45

+2

@sandy如果你只需要一個特定的鍵,爲什麼不使用'multimap :: find'?迭代器不會因插入而失效。 – pmr 2013-02-27 13:31:54

+0

感謝您的建議。我已經使用隊列來解決問題。 – sandy 2013-02-28 15:06:21