互斥體本身只確保只有一個執行線程可以在任何給定時間鎖定互斥鎖。您需要確保只有在互斥鎖被鎖定時纔會修改相關變量。
C++的確給你一種方法來做到這一點比在類似的東西更容易C.在C語言中,編寫代碼非常重要,確保在修改變量的任何位置,首先鎖定互斥鎖(當然,當你完成時,解鎖它)。
在C++中,這是很容易把它全部用一些運算符重載封裝成一個類:
class protected_int {
int value; // this is the value we're going to share between threads
mutex m;
public:
operator int() { return value; } // we'll assume no lock needed to read
protected_int &operator=(int new_value) {
lock(m);
value = new_value;
unlock(m);
return *this;
}
};
很顯然,我簡化了很多(到如此地步,它可能是無用的,因爲它代表),但希望你能得到這個想法,那就是大多數代碼只是把對象看作是一個普通變量。
但是,當您這樣做時,每次爲其分配值時都會自動鎖定互斥鎖,並在此後立即解鎖。當然,這幾乎是最簡單的情況 - 在許多情況下,您需要執行一些操作,例如鎖定互斥鎖,同時修改兩個(或更多)變量,然後解鎖。然而,不管複雜程度如何,這個想法仍然是你將所有修改過的代碼集中在一個地方,所以你不必擔心在其他代碼中鎖定互斥體。如果你的確有兩個或更多的變量,那麼你通常必須鎖定互斥體才能讀取,而不僅僅是寫入 - 否則,如果其中一個變量已被修改,但另一個變量卻沒有被修改,噸。
我想你可能對[軟件事務內存](http://en.wikipedia.org/wiki/Software_transactional_memory)感興趣,但在C++中並不存在(本地)。 – 2012-02-16 22:07:25