Я знаю, что название моего сообщения может показаться провокационным, поскольку boost :: mutex специально не раскрывает блокировку/разблокировку (во избежание мертвых замки).boost :: mutex/Как проверить, заблокирован ли мьютекс
Однако документация по ускорению довольно короткая по этим аспектам (по меньшей мере), поэтому я спрашиваю, может ли кто-нибудь помочь мне в следующем прецеденте.
Предположим, у вас есть класс Foo, который имеет:
- деструктор, который занимает некоторое время, чтобы завершить
- метод, который вызывается отдельной нитью, но не должен быть вызван во время уничтожения
class Foo
{
public:
virtual ~Foo()
{
//Time consuming operations here
}
//Method called by a timer belonging to a distinct class
void OnTimer()
{
//Other time consuming stuff. Should not be called during destruction !
}
};
Я пытался (без успеха) осуществлять версию на основе повышения :: мьютекс
//boost::mutex implementation
class Foo
{
public:
Foo()
{
}
virtual ~Foo()
{
{
boost::mutex::scoped_lock lock(mDisposingMutex);
//Time consuming operations here
}
}
//Method called by a timer belonging to a distinct class
void OnTimer()
{
{
//Imaginary code here: mutex::locked() method is private !!!
if (! mDisposingMutex.locked())
return;
}
//Other time consuming stuff. Should not be called during destruction !
}
private:
boost::mutex mDisposingMutex;
};
Am Я совершенно неправильно? Может ли кто-нибудь сказать мне, как это должно быть сделано с boost :: mutex?
Спасибо!
Почему ваш объект быть разрушен, а другой поток еще есть указатель на него? –
Не отвечая на вопрос напрямую, можете ли вы отменить регистрацию, провоцируя вызов OnTimer() как первый шаг в вашем деструкторе? Разумеется, вызов все равно может происходить асинхронно «в одно и то же время», но пока неясно, почему этот объект, подвергающийся разрушению, по-прежнему является целью этих обратных вызовов. – seh
@Anon: Согласен, это запах кода. Я все еще интересуюсь ответом. @Seh: Ваш комментарий опирается на тот же код. Однако я не могу отменить его напрямую, не нарушая инкапсуляцию. –