2012-07-08 111 views
0

我的多線程應用程序中使用std:map時出現問題。當線程寫入此對象時,我需要鎖定地圖對象。同時讀取該對象的另一個線程應該購物,直到寫入過程完成。鎖定std :: map C++

示例代碼:

std::map<int, int> ClientTable; 

int write_function() //<-- only one thread uses this function 
{ 
    while(true) 
    { 
    //lock ClientTable 
    ClientTable.insert(std::pair<int, int>(1, 2)); // random values 
    //unlock ClientTable 

    //thread sleeps for 2 secs 
    } 
} 

int read_function() //<--- many thread uses this function 
{ 
    while(true) 
    { 
    int test = ClientTable[2]; // just for test 
    } 
} 

如何鎖定此的std ::地圖對象和正確同步此線程?

+1

你可能想改變'read_function'使用'map'的'find'成員函數,而不是'運營商[]',因爲後者實際上可以修改'地圖'。通常這是一個溫和的煩惱(最壞的情況),但在這種情況下,變得更加嚴重。 – 2012-07-08 14:06:32

回答

0

好吧,由於std :: map沒有內建鎖,因此您必須使用單獨的鎖來保護地圖。如果地圖全部受到該鎖的保護,您可以對地圖進行子類化,以在「鎖定」和「解鎖」調用中添加鎖定,但是如果該鎖定將用於其他項目,那麼它可能不是最好的主意去做。

至於「如何正確同步」 - 這是非常具體的應用程序。但是,對於給出的示例,您還必須在讀取操作周圍插入鎖定/解鎖調用。

如果你有讀/寫鎖,這可能也是一個很好的應用程序。

+1

如果鎖保護地圖和其他相關對象,將地圖,鎖和其他相關對象捆綁到一個類中可能是一個好主意。該類可以提供一個函數,該函數在持有鎖的同時調用映射的「插入」函數。 '運算符[]'同上(當然,返回一個非參考右值)。 – 2012-07-08 12:56:19

1

看起來像你需要的是一個典型的讀寫鎖,允許任何數量的讀者,但一個作家。你可以看看boost的shared_mutex

其他使用例子可以在這裏找到:Example for boost shared_mutex (multiple reads/one write)?

+0

映射對於只讀操作是線程安全的,當編寫器正在工作時,我需要鎖定所有其他編寫者和讀者。當讀者工作時不需要鎖。我怎樣才能使用shared_mutex呢?我不知道任何關於它的信息(。謝謝! – Robert 2012-07-08 13:59:55

+0

@Robert:這個鎖確實如此:當一個線程想要獲得寫入鎖時,所有其他線程都被鎖定,但是當一個線程想要讀取任何其他線程時可以讀取同樣的時間(除非有人在寫,就像我說過的)檢查我鏈接的問題中的例子如何使用 – Tudor 2012-07-08 14:02:20

+0

正如ChristianStieber所說,'read_function'是一個誤導性的名字,因爲'std :: map'是'operator []'可以(將)實際修改地圖,如果該地圖不存在,則使用指定的鍵插入項目。 – 2012-07-08 14:03:36