【发布时间】:2010-08-26 08:58:54
【问题描述】:
我正在维护一个包含 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;
};
第二个实现,lock() 和 unlock() 是 const,即使这听起来不是很自然(因为我们修改了 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;
};
您更喜欢哪种解决方案?希望您的意见能帮助我做出决定。
【问题讨论】:
-
当我有一个函数接受一个参数,该参数将以 getBar 中的方式进行修改,我喜欢称它为 fillBar,这样它的作用就没有歧义了。
标签: c++ multithreading api