2012-11-20 55 views
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; 
} 

我的问题是:这是possbile避免getter/setter方法(公共变量),并保持线程安全的分配/读了这些变量的操作?

回答

3

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

4

如果你移动你的线程安全的同步代码的getter setter方法外,并与样板代码锁定互斥到处臃肿的代码,是的,它可以不使用getter和setter方法,但它会真是适得其反

2

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

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

+0

有趣吗,原子类型是否重定义了一个线程安全的运算符? –

+0

它只适用于基本类型吗? –

+0

+1:不知道那种类型,很高兴谈论它 –

3

如果C++ 11是一个选项,请考虑使用std::atomic_store and std::atomic_loadatomic_int。然而,你可能仍然应该和getter/setter呆在一起,所以你关于如何管理数据的决定(例如,atomics和mutex之间的选择)不会影响类用户,即使这只是你:)

如果C++ 11不是一个选项,那么您可以使用其中一个C++ 98兼容的原子操作实现。我已经使用了proposed boost atomic library很长一段时间,还有其他的实现漫游在互联网上。

+0

没关系,但我必须使用普通的旧C++ 98标准 –

+0

有一些工作正在进行中Boost.Atomic http://git.chaoticmind.net/cgi-bin/cgit.cgi/boost.atomic/ – chill