gpt4 book ai didi

c++ - 自定义条件作用域互斥锁

转载 作者:太空狗 更新时间:2023-10-29 21:10:23 27 4
gpt4 key购买 nike

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

我在标题中定义了这个类:

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 实例传递给条件锁。

您能为这个特定场景想出更好的方法吗?

最佳答案

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

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

在任何情况下,我都看不到在所有 mutex 实例之间共享状态的原因,因为这正是 static 的意思……另一方面另一方面,互斥锁应该由锁实例共享,但不是所有锁实例。因此,您希望锁引用到互斥量。

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

关于c++ - 自定义条件作用域互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479456/

27 4 0