我有一个可以从多个线程访问的类。它的getter和setter函数均由锁保护。
确实需要使用getter函数的锁吗?如果是这样,为什么?
class foo {
public:
void setCount (int count) {
boost::lock_guard<boost::mutex> lg(mutex_);
count_ = count;
}
int count () {
boost::lock_guard<boost::mutex> lg(mutex_); // mutex needed?
return count_;
}
private:
boost::mutex mutex_;
int count_;
};
最佳答案
拥有锁的唯一途径是,如果您可以说服自己,系统将在所有情况下自动转移 protected 变量。如果由于一个或另一个原因不能确定这一点,则需要互斥量。
对于像int这样的简单类型,您可以说服自己是对的,具体取决于体系结构,并假定它已针对单指令传输正确对齐。对于任何比这更复杂的类型,您将必须拥有锁。