1

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

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

例子:

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

2 回答 2

3

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

编辑

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

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

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

于 2012-12-07T10:29:25.030 回答
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)
于 2012-12-07T11:19:47.597 回答