2013-12-14 61 views
0

我有互斥問題...互斥內如果條件

這是我的代碼的一般結構:

#include <mutex> 
std::mutex m; 

While(1){ 
    m.lock(); 
    if(global_variable1==1){ 
     //CODE GOES HERE 
     if (err==error::eof){ 
      cout<<"error!"<<endl; 
      //should I put a m.unlock() here?? 
      continue; 
     } 
     int something=1; 
     global_variable2=something; 
    } 
    m.unlock(); 
    usleep(100000); 

} 

基本上,我想安全地改變全局變量,所以我想我需要使用互斥鎖。我應該只在解鎖互斥之後「if(global_variable1 == 1)」函數,但如果出現錯誤,互斥鎖將不會解鎖。我可以在「continue」之前解鎖它嗎?或者這是否與其他事情混淆?對同一個mutex.lock()有兩個解鎖可能會產生不希望的行爲?

+0

您必須保證'unlock();'調用,但如果您在'continue;'之前放置它,您能確定'unlock(); '會最終被調用? –

+0

是的。該鎖在第一個「if」之前被調用。只有兩種解決方法:「if(error)」和第一個「if」的結尾。第一個if後有一個解鎖。問題是:我是否也應該有一個評論? – Carollour

+0

看起來你應該這樣做。否則當'continue' by-passes bottom'unlock()' –

回答

1

這就是爲什麼C++有單獨的鎖和互斥體類:鎖是一個方便的RAII類,將確保即使拋出異常或其他一些白癡的程序員增加了一個新的return/break/continue到您的互斥被解鎖該程序。下面是這個程序的工作原理與std::unique_lock

#include <mutex> 
std::mutex m; 

While(1){ 
    std::unique_lock<std::mutex> lock(m); 
    if(global_variable1==1){ 
     //CODE GOES HERE 
     if (err==error::eof){ 
      cout<<"error!"<<endl; 
      continue; 
     } 
     int something=1; 
     global_variable2=something; 
    } 
    lock.unlock(); 

    usleep(100000); 
} 
+0

感謝您的回覆!我已經能夠解決它 – Carollour

1

不要鎖定/手動解鎖互斥!取而代之的是使用警衛,例如std::lock_guard<std::mutex>:警衛在施工時會獲得鎖定,並在銷燬後獲得釋放。要限制鎖定的時間,只需使用一個塊:

while (true) { 
    { 
     std::lock_guard<std::mutex> cerberos(m); 
     // ... 
    } 
    sleep(n); 
} 
+0

我不知道我明白了...... 我有多個線程,所以我想使用互斥鎖來阻止他們同時訪問全局變量。 如果我使用'lock_guard',我怎麼知道它的銷燬時間,如果我在無限循環中使用它? – Carollour

+1

@Carollour:當它們所在的範圍退出時,對象被銷燬,而不管它如何退出。在需要同步訪問的代碼段周圍設置一個塊,並在適當的時候使用內部的守衛整齊地獲取/釋放鎖。 –