У меня есть объект, который вызывается из двух разных потоков, и после того, как он был вызван обоими, он уничтожает себя путем «удаления этого».
Как реализовать этот потокобезопасный?Потокобезопасный означает, что объект никогда не уничтожает себя ровно один раз (он должен уничтожить себя после второго обратного вызова).
Я создал пример кода:
class IThreadCallBack
{
virtual void CallBack(int) = 0;
};
class M: public IThreadCallBack
{
private:
bool t1_finished, t2_finished;
public:
M(): t1_finished(false), t2_finished(false)
{
startMyThread(this, 1);
startMyThread(this, 2);
}
void CallBack(int id)
{
if (id == 1)
{
t1_finished = true;
}
else
{
t2_finished = true;
}
if (t1_finished && t2_finished)
{
delete this;
}
}
};
int main(int argc, char **argv) {
M* MObj = new M();
while(true);
}
Очевидно, я не могуиспользуйте Mutex в качестве члена объекта и заблокируйте удаление, потому что это также удалит Mutex.С другой стороны, если я установлю флаг «toBeDeleted» внутри защищенной мьютексом области, где установлен флаг finised, я не уверен, что возможны ситуации, когда объект вообще не удаляется.Обратите внимание, что реализация потока гарантирует, что метод обратного вызова вызывается ровно один раз на поток в любом случае.
Редактирование / обновление: Что, если я изменю Callback (..) на:
void CallBack(int id)
{
mMutex.Obtain()
if (id == 1)
{
t1_finished = true;
}
else
{
t2_finished = true;
}
bool both_finished = (t1_finished && t2_finished);
mMutex.Release();
if (both_finished)
{
delete this;
}
}
Может ли это считаться безопасным?(с mMutex, являющимся членом класса m?)
Я думаю, что если я не получу доступ ни к одному члену после освобождения мьютекса?!