2014-02-20 84 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的确。我编辑了答案来澄清这一点,谢谢。 –