我的班级里面有一些私有变量(比如int a,int b,int c)。由于一些内部操作,我需要以线程安全的方式设置/获取这些变量,所以我使用了一些包装getter / setter并使用了一个范围的互斥锁。
void setA(int a)
{
unique_lock<mutex> lock(opMutex);
this->a = a;
}
void getA(int a)
{
unique_lock<mutex> lock(opMutex);
return a;
}
void setB(int b)
{
unique_lock<mutex> lock(opMutex);
this->b = b;
}
void setC(int c)
{
unique_lock<mutex> lock(opMutex);
this->c = c;
}
我的问题是:是否可以避免使用getter / setter方法(公共变量)并保持对这些变量的赋值/读取操作的线程安全性?
答案 0 :(得分:4)
如果您将线程安全同步代码移到getter setter之外,并且使用样板代码将代码锁定到各地,那么就可以不使用getter和setter,但是它可能真的适得其反>强>
答案 1 :(得分:3)
如果选择C ++ 11,请考虑将std::atomic_store
and std::atomic_load
与atomic_int
一起使用。但是,您可能仍然应该使用getter / setter,因此您对如何管理数据的决定(例如,原子和互斥体之间的选择)不会影响类用户,即使只有您自己:)
如果C ++ 11不是一个选项,您可以使用C ++ 98兼容的原子操作实现之一。我已经使用proposed boost atomic library很长一段时间了,还有其他实现漫游互联网。
答案 2 :(得分:3)
Boost中有一个类似的库,boost::atomic但它尚未包含在标准的AFAIK中。
答案 3 :(得分:2)
您可以使用std::atomic<int> a, b, c;
PS。呃,我没有看到提升标签,所以我以为你在说C ++ 11 ......