Я делаю пользовательскую условную блокировку мьютекса с областью действия.
У меня есть этот класс, определенный в моем заголовке:
class ConditionalLock
{
public:
ConditionalLock(eastl::function<bool()> condition);
~ConditionalLock();
private:
static std::mutex s_mtx;
static bool s_shouldLock;
static bool s_lockInit;
};
.cpp выглядит так:
ConditionalLock::ConditionalLock(std::function<bool()> condition)
{
if (!s_lockInit)
{
if (condition())
s_shouldLock = true;
s_lockInit = true;
}
if (s_shouldLock)
s_mtx.Lock();
}
ConditionalLock::~ConditionalLock()
{
if (s_shouldLock)
s_mtx.Unlock();
}
Эта условная блокировка работает, если я использую ее только в одном месте, в связи с тем, что она содержит три статических элемента, которые отслеживают все, что мне нужно.Тем не менее, я хочу иметь общий условный мьютекс, который можно использовать везде.Каков был бы правильный подход?
Я думал о создании класса ConditionalMutexContext, который был бы создан в области объекта, где я хочу использовать этот мьютекс, и эта конфигурация содержала бы эти свойства.
Примерно так:
class ConditionalLockContext
{
public:
ConditionalLockContext(
std::function<bool()> condition)
: m_condition(condition)
private:
std::function<bool()> m_condition;
bool m_shouldLock;
bool m_lockInit;
}
А затем передать экземпляр ConditionalLockContext в условную блокировку по ссылке.
Не могли бы вы придумать лучший подход для этого конкретного сценария?