2014-02-20 115 views
0

我才能訪問特定的功能定義爲靜態的,由兩個線程使用互斥。由於它是靜態的,在完成階段我應該如何刪除?如果我在由每個派生類對象調用的基類析構函數中編寫以下代碼,那麼可以嗎?如何刪除靜態互斥對象

pthread_mutex_destroy(&m_mutex); 
+0

你如何分配此互斥?你甚至分配是? – 2014-02-20 10:05:03

+0

它在基類靜態定義:靜態pthread_mutex_t m_mutex; –

+0

所以它是一個局部變量,你不需要刪除它。你通過引用將它傳遞給你的線程? 這是互斥的對象的成員函數中定義或爲它這個對象的屬性? (我知道這是一個本地函數,在你的上一個答案中定義在成員函數中) – 2014-02-20 10:13:50

回答

0

你可以在適當的時候爲你創建一個helper結構體。

static pthread_mutex_t mutex; 

struct MutexDestroyer { 
    ~MutexDestroyer() { 
    pthread_mutex_destroy(&mutex); 
    } 
}; 

static MutexDestroyer mutexDestroyer; 

mutexDestroyer被銷燬時,它的析構函數會破壞你的互斥鎖。

稍後,您可以改善它成爲一個完整的RAII結構,互斥變量移動到它,並在構造函數初始化它,然後創建輔助功能鎖定和解鎖互斥。

+2

要挑剔,這不是資源獲取初始化(RAII),因爲您在初始化時沒有創建互斥鎖。更好的辦法是在'MutexDestroyer'類中聲明它(然後應該改變它的名字)並正確實現所有的對象 - 資源映射。 (允許在建築創作互斥,禁止複製,允許移動和分配,...) –

+0

@LaurentLARIZZA的確。我編輯了答案來澄清這一點,謝謝。 –