關於共同生存週期的物件與鎖的討論

2021-05-21 22:46:36 字數 952 閱讀 4842

之前與同學在談一道smart pointer的面試題,在實現thread safe的時候發現mutex的destroy始終不好解決。問題在於,當你要destroy的mutex之前,必須先unlock這個mutex,而當你unlock這個mutex的同時,你的destroy部分可能不收保護了。與另外乙個同學討論該問題,告之是鎖的設計問題。鎖不應該和要鎖的物件共享乙個生存週期。但是,當我們要實現乙個物件乙個物件的保護的時候,總不能用乙個全域性鎖去管理吧?後來發現,其實,乙個物件乙個鎖,是可以實現完整的保護的。唯一的問題就是destroy這個物件時候。通過增加乙個flag方式,我們還是可以保證destroy也能完美的。

下面是具體的**:

class myobj

~myobj(

)void dosomething().

..// access critical fields of this object

pthread_mutex_unlock(

&_mutex);}

private

:bool _isdestroyed;

pthread_mutex_t _mutex;

}

其中,我們引入了乙個flag, _isdestroyed這個boolean變數。在析構函式裡面,我們一旦準備鎖住mutex,馬上把這個flag設定成true,表示這個物件即將被destroy。那麼,其他函式在訪問所有臨界資源的時候,首先需要看看,這個物件是否馬上要被destroy了。如果是,則退出,什麼也不要做了;如果不是,再獲取鎖。析構函式只可能被呼叫一次,所以在析構函式裡面,我們不用對_isdestroyed做判斷。但是,我們需要讓_isdestroyed的變數是在mutex lock之後才能設定。

這樣,即使有執行緒在析構函式的pthread_mutex_unlock(&_mutex)和pthread_mutex_destroy(&_mutex)之間執行了dosomething,也不會影響到臨界資源的破壞。

物件的生存週期

在學習析構函式時,了解到一般物件的銷毀是在main函式內return之後。在棧上構造的物件要符合棧的先進後出的規則。堆上new的物件需要遇到delete的時候才能銷毀,否則會出現記憶體洩漏。所以一般的物件生存週期為定義點開始,return之後main函式退出之前結束。對於特殊的物件,總結如下 1 全...

c 類物件的生存週期

在這裡我們會通過乙個例子來給大家解釋說明 include using namespace std class test public test int a 5,int b 5 ma a mb b cout 1 因為物件t1處於全域性中,所以t1最先被構造,呼叫建構函式 2 由於物件t5 也處於全域性...

C 中物件的生存週期

在c中有變數的生存週期,那麼在c 中就有物件的生存週期。1 普通物件的生存週期 若有乙個cobject類,屬性是姓名和年齡。cobject gobject1 int main cobject gobject2 函式呼叫的先後順序是 建構函式 gobject1 gobject2 object1 obj...