2013-09-23 62 views
1

我有兩個線程。線程1以特定的時間間隔遞增其自己的一個變量(consumenum)。同時,我有thread2,它也增加了thread1的一個變量(iter-> second-> producenum)。當我在兩個線程中增加這些變量時,是否需要對這些變量進行互斥保護?C++地圖線程同步

線程1:

mutex1->lock(); 
std::map<uint32_t, myframe>::iterator it2 = mymap.find(consumenum); 
mylocalframe = it2->second; 
mymap.erase (it2); 
mutex1->unlock(); 

consumenum++; 

mutex2->lock(); 
pktctr--; 
mutex2->unlock(); 

線程2:

std::map<int, Thread1 *>::iterator iter = mythreads.find(id); 
iter->second->mutex1->lock(); 
iter->second->mymap.insert(std::pair<uint32_t,myframe>(iter->second->producenum, myframeval)); 
iter->second->mutex1->unlock(); 

iter->second->producenum++; 

iter->second->mutex2->lock(); 
iter->second->pktctr++; 
iter->second->mutex2->unlock(); 
+0

恐怕根據給出的信息唯一合理的答案是「它取決於」。 – NPE

+0

地圖功能如何?你不能遞增地圖,所以我認爲'var1'和'var2'是標量? – NPE

+0

向我們展示一些代碼,否則它太含糊。 – billz

回答

2

根據您發佈的代碼,不,您不需要互斥鎖。只有在您從兩個線程訪問相同數據時才需要互斥鎖。只要在Thread2的生命週期中不刪除Thread1,就可以從2個不同的線程增加2個不同的整數。

2

是的,當然你需要它,例如關鍵部分:

std::mutex g_i_mutex; 

void increment_map(std::map &myMap) 
{ 
    std::lock_guard<std::mutex> lock(g_i_mutex); 
    // increment map 

    // g_i_mutex is automatically released when lock 
    // goes out of scope 
} 
+0

考慮到這個問題沒有提到操作系統或編譯器,我寧願看到一個使用'std ::'工具的例子,如果有必要的話,以後還會有一個特定於平臺的示例。另外,RAII非常棒。 – BoBTFish

+3

沒有理由,我不認爲這是(非常模糊)問題的一個非常有用的答案。 – NPE

+0

@BobTheFish:你說得對,編輯 – duDE

1

是的,你需要它。如果你處理VAR1或VAR2,因此必須將這些變量同互斥保護。