4

我的班级中有一些私有变量(比如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

4 回答 4

4

如果您将线程安全同步代码移到 getter setter 之外,并且到处都使用样板代码锁定互斥锁使代码膨胀,是的,可以不使用 getter 和 setter,但这会适得其反

于 2012-11-20T14:45:29.057 回答
3

如果 C++11 是一个选项,请考虑使用std::atomic_storeandstd::atomic_load with atomic_int。但是,您可能仍应使用 getter/setter,因此您对如何管理数据的决定(例如,原子和互斥体之间的选择)不会影响类用户,即使只有您自己 :)

如果 C++11 不是一个选项,您可以使用 C++98 兼容的原子操作实现之一。我已经使用建议的 boost atomic 库很长一段时间了,并且还有其他实现在 Internet 上漫游。

于 2012-11-20T14:50:42.810 回答
3

Boost 中有一个类似的库boost::atomic但它尚未包含在标准 AFAIK 中。

于 2012-11-20T15:38:37.950 回答
2

您可以使用std::atomic<int> a, b, c;

PS。呃,我没有看到 boost 标签,所以我以为你在说 C++11 ...

于 2012-11-20T14:47:28.053 回答