这应该被称为互斥锁吗?
Should this be called a mutex?
本文关键字:被称为 更新时间:2023-10-16
>我有可以在不同模式下打开的对象,其中包括读取和写入。如果你打开它阅读你仍然可以打电话
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 (http://en.cppreference.com/w/cpp/language/raii(。
一般来说,这样的对象可以称为"RAII对象"。
对于代码中的名称,您可以使用 ScopedSomething
.例如,在这种特殊情况下,ScopedObjectUpgrader
或为范围执行的另一个有意义的操作名称。
对我来说
听起来更像是可升级的互斥锁
看看 RAII 包装器,了解可升级的互斥体 如何解锁 boost::upgrade_to_unique_lock(由 boost::shared_mutex 制成(? 以更好地了解如何自己编写一个。
例如,您可能希望编写两个单独的 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
}
相关文章:
- 为什么当"::"的行为不像运算符时被称为'scope resolution operator'?
- 为什么C++被称为语言联盟?
- 这应该被称为互斥锁吗?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 复制ctor被称为而不是移动ctor-可以编译器发出警告
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- 私有非虚拟基类函数被称为派生类中的函数
- 为什么在使用对象作为多映射中的键时,驱动器被称为远远不够
- 持续的指示持续的指针被称为
- 多次被称为驱动器
- 为什么SelectObject被称为两次
- 为什么Qwizard :: NextID()被称为两次
- C++对象声明被称为抽象
- 为什么击改变人被称为两次
- 特定的位数可以被称为标志吗
- 为什么委托或闭包通常被称为真正的"object-oriented function pointers"?
- 为什么它被称为重叠I/O
- 这个C++14构造被称为什么,它似乎链接了lambdas
- 我如何在图中找到双分量?被称为块
- CoInitialize()在c++中没有被称为异常