Пользовательский условный мьютексный замок - PullRequest
0 голосов
/ 01 февраля 2019

Я делаю пользовательскую условную блокировку мьютекса с областью действия.

У меня есть этот класс, определенный в моем заголовке:

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 в условную блокировку по ссылке.

Не могли бы вы придумать лучший подход для этого конкретного сценария?

1 Ответ

0 голосов
/ 01 февраля 2019

Вы путаете мьютексы с замками.В C ++ мы реализуем блокировку RAII с помощью (ограниченных) блокировок, мьютексы не имеют такого поведения;посмотрите на std::mutex.

Вы хотите реализовать условную блокировку области действия (возможно, производную от std::unique_lock?).Состояние, заблокировало ли оно что-то, отделено от состояния мьютекса.

В любом случае я не вижу причины наличия общего состояния между всеми экземплярами мьютекса, потому что этоименно то, что означает static ... С другой стороны, мьютекс должен совместно использоваться экземплярами блокировки, но не все они.Таким образом, вы хотите, чтобы блокировки относились к мьютексам.

Если вы не хотите наследовать от std::unique_lock (private -ly, конечно), удалить все static спецификаторы и измените мьютекс члена так, чтобы это было ссылка , которая предоставляется во время построения блокировки.

...