假设我有一个看起来像这样的类(实际上正是这个大小):
class K
{
public:
long long get_x() const; // lock m_mutex in shared/read-only mode
void update( long long w ); // lock m_mutex with a unique_lock
private:
long long m_a;
long long m_b;
long long m_c;
long long m_x;
double m_flow_factor;
mutable boost::shared_mutex m_mutex;
};
如您所见,这应该是线程安全的。更新函数一次被一个线程调用,未知但只有一个线程(保证),但是访问器可以被多个线程同时调用。
更新函数正在改变所有的值并且被非常频繁地调用(每秒一百次)。您可以猜到,当前的实现将锁定很多。
我正在考虑使用 std::atomic 来避免锁定并可能使此代码更有效。但是,我真的需要更新函数来一起更新值。因此,我正在考虑做这样的事情:
class K
{
public:
long long get_x() const
{ return data.load().x; }
void update( long long w )
{
auto data_now = data.load();
// ... work with data_now
data.store( data_now );
}
private:
struct Data {
long long a;
long long b;
long long c;
long long x;
double flow_factor;
};
std::atomic<Data> data;
};
我目前对 std::atomic 的理解是,即使这段代码比前一个代码更具可读性(因为它没有到处都有锁声明),因为 K::Data 结构是“大”的,std::atomic将只使用普通的互斥锁来实现(所以它不应该比我的初始实现更快)。
我对么?