自定义条件作用域互斥锁

Custom conditional scoped mutex lock

我正在制作一个自定义条件作用域互斥锁。

我在 header 中定义了这个 class:

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,它将在我想使用此互斥锁的 object 范围内实例化,并且该配置将包含这些属性。

像这样:

class ConditionalLockContext 
{
public:
    ConditionalLockContext(
        std::function<bool()> condition)
    : m_condition(condition)

private: 
    std::function<bool()> m_condition;
    bool m_shouldLock;
    bool m_lockInit;
}

然后通过引用将ConditionalLockContext 实例传递给条件锁。

您能想到针对此特定场景的更好方法吗?

您将互斥与锁混淆了。在 C++ 中,我们通过(作用域)锁实现 RAII 锁定,互斥体没有这种行为;看看 std::mutex.

您想实现一个条件作用域锁(可能源自 std::unique_lock?)。是否锁定某些东西的状态与互斥体的状态分开。

无论如何,我看不出在 all 互斥实例之间有一个共享状态的原因,因为这正是 static 的意思...另一方面,互斥锁应该由锁实例共享,但不是所有锁实例。因此,您希望锁定 refer 到互斥锁。

如果您不想从 std::unique_lock 派生(当然,private-ly),删除所有 static 说明符,并更改成员互斥锁,使其成为在构造锁期间提供的 reference