我正在制作自定义的条件范围互斥锁。
我在标头中定义了此类:
@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实例传递给条件锁。
您能为这种特定情况想到更好的方法吗?
答案 0 :(得分:3)
您正在使互斥锁与锁混淆。在C ++中,我们通过(作用域)锁实现RAII锁定,互斥锁不具有此行为;看std::mutex
。
您要实现条件范围锁(也许是从std::unique_lock
派生的?)。是否锁定某物的状态与互斥锁的状态分开。
无论如何,我看不出在所有互斥体实例之间具有共享状态的原因,因为这正是static
的含义...另一方面,互斥锁应该由锁实例共享,但不是。因此,您希望锁引用互斥锁。
如果您不想从std::unique_lock
(当然是private
派生),请删除所有static
指定符,然后更改成员互斥量因此它是在构造锁期间提供的引用。