我才能訪問特定的功能定義爲靜態的,由兩個線程使用互斥。由於它是靜態的,在完成階段我應該如何刪除?如果我在由每個派生類對象調用的基類析構函數中編寫以下代碼,那麼可以嗎?如何刪除靜態互斥對象
pthread_mutex_destroy(&m_mutex);
我才能訪問特定的功能定義爲靜態的,由兩個線程使用互斥。由於它是靜態的,在完成階段我應該如何刪除?如果我在由每個派生類對象調用的基類析構函數中編寫以下代碼,那麼可以嗎?如何刪除靜態互斥對象
pthread_mutex_destroy(&m_mutex);
你可以在適當的時候爲你創建一個helper結構體。
static pthread_mutex_t mutex;
struct MutexDestroyer {
~MutexDestroyer() {
pthread_mutex_destroy(&mutex);
}
};
static MutexDestroyer mutexDestroyer;
當mutexDestroyer
被銷燬時,它的析構函數會破壞你的互斥鎖。
稍後,您可以改善它成爲一個完整的RAII結構,互斥變量移動到它,並在構造函數初始化它,然後創建輔助功能鎖定和解鎖互斥。
要挑剔,這不是資源獲取初始化(RAII),因爲您在初始化時沒有創建互斥鎖。更好的辦法是在'MutexDestroyer'類中聲明它(然後應該改變它的名字)並正確實現所有的對象 - 資源映射。 (允許在建築創作互斥,禁止複製,允許移動和分配,...) –
@LaurentLARIZZA的確。我編輯了答案來澄清這一點,謝謝。 –
你如何分配此互斥?你甚至分配是? – 2014-02-20 10:05:03
它在基類靜態定義:靜態pthread_mutex_t m_mutex; –
所以它是一個局部變量,你不需要刪除它。你通過引用將它傳遞給你的線程? 這是互斥的對象的成員函數中定義或爲它這個對象的屬性? (我知道這是一個本地函數,在你的上一個答案中定義在成員函數中) – 2014-02-20 10:13:50