自定义条件范围的互斥锁

时间:2019-02-01 12:22:59

标签: c++ multithreading thread-safety mutex

我正在制作自定义的条件范围互斥锁。

我在标头中定义了此类:

@SpringBootApplication
public class MainConfiguration extends SpringBootServletInitializer{

.cpp看起来像这样:

class ConditionalLock
{
public:
    ConditionalLock(eastl::function<bool()> condition);
    ~ConditionalLock();

private:        
    static std::mutex s_mtx;
    static bool s_shouldLock;
    static bool s_lockInit;
};

如果我只在一个地方使用它,这个条件锁就可以解决问题,因为它包含三个静态成员来跟踪我需要的所有东西。 但是,我希望有一个通用的条件互斥量可以在任何地方重用。正确的方法是什么?

我考虑过要创建一个ConditionalMutexContext类,该类将在要使用此互斥对象的对象范围内实例化,并且该配置将包含这些属性。

类似的东西:

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();
}

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

您能为这种特定情况想到更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您正在使互斥锁与锁混淆。在C ++中,我们通过(作用域)锁实现RAII锁定,互斥锁不具有此行为;看std::mutex

您要实现条件范围锁(也许是从std::unique_lock派生的?)。是否锁定某物的状态与互斥锁的状态分开。

无论如何,我看不出在所有互斥体实例之间具有共享状态的原因,因为这正是static的含义...另一方面,互斥锁应该由锁实例共享,但不是。因此,您希望锁引用互斥锁。

如果您不想从std::unique_lock(当然是private派生),请删除所有static指定符,然后更改成员互斥量因此它是在构造锁期间提供的引用

相关问题