c – Mutex的锁定/解锁功能是否为“const”?
发布时间:2020-12-16 05:42:15 所属栏目:百科 来源:网络整理
导读:我正在维护一个包含Mutex类的库.我不能决定这个类暴露的lock()和unlock()函数是否应该是const.我在网上寻找类似的代码,可以找到这两个实现. 首先实现,lock()和unlock()不是const.这意味着在const函数中使用Mutex类的人应该额外调用Mutex的函数: class Mutex
我正在维护一个包含Mutex类的库.我不能决定这个类暴露的lock()和unlock()函数是否应该是const.我在网上寻找类似的代码,可以找到这两个实现.
首先实现,lock()和unlock()不是const.这意味着在const函数中使用Mutex类的人应该额外调用Mutex的函数: class Mutex { public: void lock(); void unlock(); }; class Foo { public: void getBar(Bar& bar) const { m_mutex.lock(); bar = m_bar; m_mutex.unlock(); } private: // Mutable,responsability of the user (or we could use a const_cast when needed) mutable Mutex m_mutex; Bar m_bar; }; 第二个实现,即使这个声音听起来不是很自然(因为我们修改了Mutex的实例),但是在他的一个const函数中调用这些函数的时候,用户就不用烦恼了, class Mutex { public: void lock() const; void unlock() const; }; class Foo { public: void getBar(Bar& bar) const { m_mutex.lock(); bar = m_bar; m_mutex.unlock(); } private: Mutex m_mutex; Bar m_bar; }; 你喜欢什么解决方案?我希望你的意见能够帮助我做出决定. 解决方法
这种东西是可变的.也就是说,mutable适用于不参与对象的逻辑常量的事物. (如果一个值为“逻辑常数”,则表示“主”值为常数,对象的值从外部不能更改.)
您的对象的值独立于互斥体的状态(它只是提供一致性的实现细节,它的状态在类之外是不知道的),这是您的互斥体应该是可变的. 注意,你不应该去const_cast路由. This leads to undefined behavior如果你这样做的: const Foo f; Bar b; f.getBar(b); // takes const off of mutex,modifies (bang you're dead) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |