Kol*_*nya 0 c++ multithreading mutex thread-safety delete-operator
免责声明: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 );
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想要foo安全删除,因此线程中不会发生错误.我添加了一个析构函数Foo:
Foo::~Foo()
{
pthread_mutex_lock ( &mutex );
}
Run Code Online (Sandbox Code Playgroud)
现在,在所有线程完成当前循环之前,不会删除该对象.
问题是:删除实例后是否会解锁互斥锁?删除实例后,所有线程都会完成吗?我打赌答案是no.所以我改变了析构函数,但现在看起来线程不安全:
Foo::~Foo()
{
pthread_mutex_lock ( &mutex );
pthread_mutex_unlock ( &mutex );
}
Run Code Online (Sandbox Code Playgroud)
线程函数是否可以锁定互斥锁pthread_mutex_unlock ( &mutex );并在删除对象之后开始操作实例?
MSa*_*ers 11
让我们从问题的开头开始:
我有一个程序,在其中我创建了一个Foo实例,我在很多线程中使用它.然后我想要安全地删除它,以便这些线程不会陷入分段错误.
您无法删除正在使用的对象.没有多少互斥量可以解决这个问题.
我在Foo中添加了一个析构函数
这仅在Foo被删除时运行.但是它的内容并不重要:在其他线程仍在使用Foo时调用dtor是错误的.
我希望在删除实例时安全地退出一个线程.这怎么可能?
嗯,这是正确的问题.我可以编写大量代码供您使用,但该代码只是一个副本boost::weak_ptr.所以,我不会打扰.只需自己动手代码即可.
提升不允许.
那你为什么要问StackOverflow?这基本上是相同的许可证.