【问题标题】:Lock mutex of object before destroy it will deallocate memory or some other unexpected在销毁之前锁定对象的互斥锁将释放内存或其他一些意外
【发布时间】:2012-12-07 10:18:17
【问题描述】:

delete这个对象(不解锁)之前锁定c++对象的互斥锁是一种好的和安全的做法吗?我这样做是为了保护其他线程在此毫秒内可能使用对象(概率非常低)。

之后内存会不会被分配?这是一个好习惯吗?

例子:

    ptr_to_delete->MUTEX.lock_writing(); // can not delete session if its already locked. (additational protection)
    ptr_to_delete->cleanup();
    delete ptr_to_delete;

【问题讨论】:

  • 你用的是什么库?对象的析构函数会释放互斥锁吗?
  • @piokuc“pthreads”。不,Mutex - 是对象的一部分。互斥锁锁定 -> 然后delete 调用对象并且没有析构函数可以解锁(释放互斥锁)。

标签: c++ unix memory pthreads


【解决方案1】:

“我这样做是为了保护其他线程在此毫秒内可能使用对象”。在这种情况下,对象的互斥锁是否被锁定并不重要——如果你已经在一个线程中删除了对象,而其他线程仍然有一个指向它的指针,可能可以使用,你会遇到麻烦的。

编辑

还是有问题。正如 piokuc 所说,您需要在某个时候释放和释放互斥锁,否则您的程序将会泄漏。

仍然存在工作线程和清理线程可以同时获取对象指针的情况。如果清理线程在工作线程使用它之前删除了对象,您将得到未定义的行为(即崩溃)。

您应该为指针数组创建一个访问器函数,该函数仅在指针未锁定时返回(并在返回之前锁定它)。这样,一次可能只有一个线程拥有该指针,并且工作线程不可能获取/使用已被您的清理线程删除的指针。

【讨论】:

  • 原因是同步。当其他线程可以从数组和内存中删除对象时,其他线程可以同时从数组中获取指向对象的指针。 “工作”线程将始终获取指针,然后锁定互斥锁,进行一些工作,然后解锁互斥锁并永远丢失指针。如果我将在delete 对象之前将对象的互斥锁锁定在“CLEANING”线程——如果其他线程在释放互斥锁之前继续使用对象,“Cleaning”线程将始终等待(停止)。然后“清理”线程捕获互斥锁并删除对象(对不起我的英语)
【解决方案2】:

Pthreads 没有lock_writing 函数,因此无法在不知道其作用的情况下查看您的代码。

但是,在锁定的互斥体上调用 pthread_mutex_destroy 是未定义的行为。因此,假设对象的析构函数确实销毁了它的互斥体(显式地或作为数据成员的析构函数的一部分),您必须在此之前解锁互斥体。

如果您在正确的位置解锁它,那么您的密码就是正确的。如果你在错误的地方解锁它,那么它是不正确的。我不能准确地告诉你正确的地方在哪里。

其他线程可以同时从数组中获取指向对象的指针 当其他线程可以让它从数组和内存中删除时。 “工作”线程总是会获取指针,然后锁定互斥锁,做一些工作然后解锁互斥锁并永远丢失指针。

您可能需要一个互斥锁来保护整个数据结构,而不仅仅是其中的一个对象。在我看来,可能存在竞争条件:

Thread 1                                Thread 2
                                    get pointer to object from data structure
get ptr from data structure
lock object
cleanup
unlock object
destroy object
                                    lock object (oops, it doesn't exist any more)

【讨论】:

  • 我的lock_writing()pthread_rwlock_wrlock(&aMutex); 的简单封面。谢谢。我有整个数据结构的互斥锁,但我将其锁定为“读取”(并且仅在“擦除/插入”时升级锁定以写入。我将查看我的代码并更多地考虑竞争条件。谢谢。
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2013-06-14
相关资源
最近更新 更多