从多线程程序安全地删除对象

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?这基本上是相同的许可证.

  • @Kolyunya:你了解供应商`std :: string`实现中的小字符串优化吗?用于优化某些std lib类型的内存需求的空基类技巧?没有?认为这样.现在,你的异议又是什么? (3认同)
  • TRWTF是"允许创意,而不是代码".你能拼写"NIH综合症"吗? (2认同)
  • @Kolyunya:认真吗?您会走多远-您知道(或关心)如何实现pthread_mutex_t吗? (2认同)