我有一个可以从多个线程访问的类。它的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这样的简单类型,您可以说服自己是对的,具体取决于体系结构,并假定它已针对单指令传输正确对齐。对于任何比这更复杂的类型,您将必须拥有锁。

10-06 10:39
查看更多