2014-03-07 114 views
0

我記得在某個會議上看到它,但無法找到任何關於此的信息。互斥/鎖定與範圍/代碼塊

我想是這樣的:

lock(_somelock) 
{ 
    if (_someBool) 
     return; 

    DoStuff(); 
} // Implicit unlock 

相反的:

lock(_somelock); 
if (_someBool) 
{ 
    unlock(_somelock); 
    return; 
} 

DoStuff(); 
unlock(_somelock); 

正如你可以看到代碼變得很臃腫與多個早期的回報。 很明顯,人們可以使另一個函數來處理鎖定/解鎖,但它更好嗎?

C++ 11標準庫可能嗎?

+0

你可能要檢查[這個參考(http://en.cppreference.com/w/cpp/thread)。 –

回答

6

是的,你可以使用std::lock_guard來包裝互斥。

{ 
    std::lock_guard<std::mutex> lock(your_mutex); 

    if (_someBool) 
     return; 

    DoStuff(); 

} 
3

標準成語是使用保護對象,其生命週期包括互斥的鎖定狀態:

std::mutex m; 
int shared_data; 

// somewhere else 

void foo() 
{ 
    int x = compute_something(); 

    { 
     std::lock_guard<std::mutex> guard(m); 
     shared_data += x; 
    } 

    some_extra_work(); 
} 
0

您可以簡單地創建自己的自鎖定。

Class AutoLock 
{ 
    pthread_mutex_t *mpLockObj; 

    AutoLock(pthread_mutex_t& mpLockObj) 
    { 
     mpLockObj = &mpLockObj; 
     pthread_mutex_lock(mpLockObj); 
    } 

    ~AutoLock() 
    { 
    pthread_mutex_unlock(mpLockObj); 
    } 
}; 

使用,如:

#define LOCK(obj) AutoLock LocObj(obj); 
int main() 
{ 

    pthread_mutex_t lock; 
    LOCK(lock); 

    return 0; 
}