getter函数是否需要互斥锁?

cai*_*rol 11 c++ multithreading mutex locking

我有一个可以从多个线程访问的类.getter和setter函数都有锁.是否需要用于吸气功能的锁?为什么?

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_;
};
Run Code Online (Sandbox Code Playgroud)

Mic*_*hne 16

你可以解决锁定的唯一方法是你可以说服自己系统将在所有情况下以原子方式转移受保护的变量.如果由于某种原因无法确定,那么您将需要互斥锁.

对于像int这样的简单类型,您可能能够说服自己这是真的,这取决于体系结构,并假设它适合于单指令传输.对于任何比这更复杂的类型,你将不得不拥有锁.


Jos*_*ury 5

如果您在getter周围没有互斥锁,并且一个线程正在读取它,而另一个线程正在编写它,那么您会得到有趣的结果。

  • 确实-这是未定义的行为。最好有一分钟的锁开销,而不是内存损坏。 (2认同)