自定义条件作用域互斥锁
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。
我正在制作一个自定义条件作用域互斥锁。
我在 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。