Блокировки потоков C ++ при переопределении функций класса - PullRequest
0 голосов
/ 19 июня 2020

Я столкнулся с проблемой, связанной с использованием блокировок потоков в виртуальных функциях.

Я пишу класс без потоков (например, 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(), что немного сбивает с толку.

Есть ли лучшее решение этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...