Правильное разрушение объекта в многопоточной среде - PullRequest
0 голосов
/ 29 июня 2018

Я унаследовал многопоточный унаследованный код, который, по-моему, неправильно уничтожает объект.

class A
{
private:
    TCCState *b; // TCCState is struct from third party library
public:
    static A func1();
    ~A();
};

std::unique_ptr<A> A::func1()
{
    std::unique_ptr<A> res(new A());
    int ret = gen_tcc_context(res); // gen_tcc_context is library function
    return res; // this res is used as std::unique_ptr<A> temp(std::move(A::func1())); and then properly destroyed 
}

A::~A()
{
    if (b != nullptr){// Is this necessary? If yes, should I used a lock_guard for this code? 
        tcc_delete(b);// tcc_delete is a library function. This raises an exception - Assertion failed: ("Invalid file descriptor. File possibly closed by a different thread",0)
    }
}

Похоже, фрагмент кода в деструкторе пытается закрыть то, что уже закрыто. Действительно ли необходим фрагмент кода в деструкторе? Если да, безопасно ли использовать lock-guard?

1 Ответ

0 голосов
/ 29 июня 2018

Когда объект готов к уничтожению, это означает, что его использует только текущий поток. Если это не так, то управление временем жизни объекта недопустимо. Таким образом, деструктор в нижней строке не требует синхронизации.

Не по теме:
вам вообще не нужен деструктор, если вы правильно определите указатель:

class TCCState_deleter {
public:
    void operator()(TCCState *b) {
         tcc_delete(b);
    }
};

class A
{
private:
    std::unique_ptr<TCCState, TCCState_deleter> b;
public:
    static A func1();
};
...