公共变量访问的线程安全性

时间:2012-11-20 14:41:14

标签: c++ boost thread-safety mutex getter-setter

我的班级里面有一些私有变量(比如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方法(公共变量)并保持对这些变量的赋值/读取操作的线程安全性?

4 个答案:

答案 0 :(得分:4)

如果您将线程安全同步代码移到getter setter之外,并且使用样板代码将代码锁定到各地,那么就可以不使用getter和setter,但是它可能真的适得其反强>

答案 1 :(得分:3)

如果选择C ++ 11,请考虑将std::atomic_store and std::atomic_loadatomic_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 ......