免责声明:Boost 和 C++11 都不允许。
我有一个程序,我在其中创建了一个实例,Foo
并在多个线程中对其进行操作。然后我想安全地删除它,这样那些线程就不会陷入分段错误。
Foo
每次线程函数运行时,我都添加了一个互斥锁成员并将其锁定。为了不同的线程不会相互冲突。
class Foo
{
public:
pthread_mutex_t mutex;
};
void* thread ( void* fooPtr )
{
Foo* fooPointer = (Foo*) fooPtr;
while ( 1 )
{
if ( fooPointer )
{
pthread_mutex_lock ( &fooPointer->mutex );
/* some code, involving fooPointer */
pthread_mutex_unlock ( &fooPointer->mutex );
}
else
{
pthread_exit ( NULL );
}
}
}
现在我想foo
安全地删除,所以线程中不会发生错误。我添加了一个析构函数Foo
:
Foo::~Foo()
{
pthread_mutex_lock ( &mutex );
}
现在,在所有线程完成当前循环之前,不会删除该对象。
问题是:删除实例后互斥锁会被解锁吗?删除实例后所有线程都会结束吗?我敢打赌答案是no
。所以我改变了析构函数,但现在它似乎是线程不安全的:
Foo::~Foo()
{
pthread_mutex_lock ( &mutex );
pthread_mutex_unlock ( &mutex );
}
线程函数可以在pthread_mutex_unlock ( &mutex );
对象被删除之后和之前锁定互斥锁并开始操作实例吗?