I have a class that is accessed from multiple threads. Both of its getter and setter functions are guarded with locks.
Are the locks for the getter functions really needed? If so, why?
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_;
};
The only way you can get around having the lock is if you can convince yourself that the system will transfer the guarded variable atomicly in all cases. If you can’t be sure of that for one reason or another, then you’ll need the mutex.
For a simple type like an int, you may be able to convince yourself this is true, depending on architecture, and assuming that it’s properly aligned for single-instruction transfer. For any type that’s more complicated than this, you’re going to have to have the lock.