Я столкнулся с проблемой, связанной с использованием блокировок потоков в виртуальных функциях.
Я пишу класс без потоков (например, Class
), который использует блокировку потоков (например, m_lock
). В этом классе есть виртуальная функция, которую нужно переопределить. Функция выглядит так:
virtual return_type Fun(parameters)
{
Lock(m_lock);
// Do something
Unlock(m_lock);
}
Теперь, когда пользователь хочет переопределить функцию, он может записать переопределенную версию следующим образом:
return_type Fun(parameters) override
{
Lock(m_lock);
Class::Fun(parameters);
// Do something
Unlock(m_lock);
}
Здесь m_lock
заблокирован дважды , что может вызвать тупик. Я придумал решение этой проблемы --- Поместите вещи Fun()
в защищенную функцию (скажем, InternalFun()
) и настройте Fun()
на
virtual return_type Fun(parameters)
{
Lock(m_lock);
InternalFun(parameters);
Unlock(m_lock);
}
Но я я не очень доволен, поскольку каждый пользователь должен позвонить InternalFun()
вместо Fun()
, что немного сбивает с толку.
Есть ли лучшее решение этой проблемы?