2010-07-19 59 views
6

過去幾年我一直在使用C#,而我目前正在使用C++進行bug修復。 在C#中,我可以使用對象上的鎖,使我的代碼線程安全的搭配:在C++中使用範圍自動鎖定/解鎖(來自C#背景)

lock(lockObject) 
{ 
    // Do some work 
} 

,如果有內// Do some work

異常這將解鎖lockOject是否有C++類似的東西?此刻,我能想到的兩種:

// Code 
{ 
    AutoLock lock(lockObject); 
    // Do some work 
} 
// More Code 

,但我不喜歡大括號只是爲了範圍我AutoLock。目前,我正在做:

AutoLock lock(lockObject); 
// Do some work 
lock.Unlock(); 

,讓異常展開解除鎖定,如果有在//Do some work異常。

我現在正在做的工作,但我想知道是否有更好的方法,謝謝。

+0

_But我不喜歡大括號只是爲了限制我的'AutoLock'._除了它們的放置位置,它們與C#所做的有什麼不同呢? – 2010-07-19 16:18:13

+0

用C#的'using(..){...}'和'lock(...){...}'你可以看到發生了什麼。對我來說,只有空的'{...}'創建一個本地範圍來使'Autolock'毀壞纔是錯誤的。 – JLWarlow 2010-07-20 08:17:45

+0

這是有道理的。 C++的做事方式的一個優點是你只需要一個範圍來清理多個鎖;如果我記得沒錯,在C#中,最後可能會出現'lock(m0){lock(m1){lock(m2){}}}' – 2010-07-20 14:53:28

回答

8

但我不喜歡花括號只是爲了限定我的AutoLock

這就是在C++中完成的。

請注意,您不需要爲每個AutoLock都有單獨的範圍塊;以下內容也不錯:

{ 
    AutoLock lock1; 
    AutoLock lock2; 
    // more code goes here 
} // lock2 gets destroyed, then lock1 gets destroyed 

它不一定是一個單獨的範圍塊;如果你在某個函數中鎖定了一些東西,並且在函數返回之前不需要解鎖它,那麼你可以簡單地使用函數範圍來限制鎖定。同樣,如果您在循環塊的每次迭代過程中鎖定某些內容,則可以使用循環的範圍塊來約束鎖定。

當你完成它的手動解鎖互斥鎖的方法是好的,但它不是慣用的C++並且不太清楚。這使得更難確定互斥鎖的解鎖位置(可能並不困難,但比需要更難)。

+0

Re:手動解鎖。誠然,這不是一個理想的選擇。我已經使用了智能指針接口,可以讓你'.Release()',但會超出範圍時自動釋放。 從C++編程開始已經有相當長的一段時間了,我可能已經忘記/錯過了一些適合我以後的東西。因此,這個問題。 – JLWarlow 2010-07-20 08:20:51

2

你的第二個版本就好了。考慮分割你的方法,如果你有太多的大括號只是作用域鎖定。請閱讀RAII,這是這種技術背後的一般模式,它可以應用於各種資源管理。

+0

感謝在RAII上的鏈接,我現在正在尋找智能指針來保護我的代碼所接收的內存塊。 – JLWarlow 2010-07-20 08:23:38