C++ 这应该称为互斥吗?
我有可以以不同模式打开的对象,其中包括读和写。 如果你打开它读你仍然可以打电话C++ 这应该称为互斥吗?,c++,mutex,C++,Mutex,我有可以以不同模式打开的对象,其中包括读和写。 如果你打开它读你仍然可以打电话 object->upgradeOpen(); 在我们的代码中,调用 object->downgradeOpen(); 当你写完后。 我通常觉得使用C++中的互斥概念更容易,在这里你让这个升级和向下打开在这个互斥对象的构造函数和析构函数中完成。 class ObjectMutex{ public: ObjectMutex(const Object& o) : m_o(o)
object->upgradeOpen();
在我们的代码中,调用
object->downgradeOpen();
当你写完后。我通常觉得使用C++中的互斥概念更容易,在这里你让这个升级和向下打开在这个互斥对象的构造函数和析构函数中完成。
class ObjectMutex{
public:
ObjectMutex(const Object& o)
: m_o(o)
{
m_o.upgradeOpen();
}
~ObjectMutex(){
m_o.downgradeOpen();
}
private:
Object m_o;
};
唯一的问题是,它并没有真正锁定对象以使其线程安全,所以我不认为它真的是互斥锁。
有没有另一个公认的名称来称呼这个结构?在这个类中实现的原理被称为RAII() 通常,此类对象可以称为“RAII对象”
对于代码中的名称,可以使用
ScopedSomething
。例如,在这种特殊情况下,ScopedObjectUpgrader
或为该范围执行的另一个有意义的操作名称。听起来更像是
请看一看RAII可升级互斥体包装器,以更好地了解如何自己编写互斥体
例如,您可能想要编写两个独立的RAII包装器
class OpenLock {
public:
OpenLock(Object& o_in) : o{o_in} {
this->o.open();
}
~OpenLock() {
this->o.close();
}
private:
Object& o;
};
class UpgradeOpenLock {
public:
UpgradeOpenLock(Object& o_in) : o{o_in} {
this->o->upgradeOpen();
}
~UpgradeOpenLock() {
this->o->downgradeOpen();
}
private:
Object& o;
};
然后像这样使用它
{
OpenLock open_lck(o);
// freely read
{
UpgradeOpenLock upgrade_lck(o);
// freely read or write
}
// freely read again
}
这个原则听起来不错,但我能用它来实现我的代码吗?@turoni是的!请看一个链接问题,了解如何围绕可升级Mutex构建RAII包装器的示例。您是否可以添加一个代码示例,因为我不知道如何使用它比使用我编写的简单类更容易。我想您的意思是通过引用而不是通过类中的值来存储对象?@downvoter为什么我的答案被否决?请考虑留下一个评论来解释我如何改进我的答案。