我有一个类,我想在不同的线程中使用,我想我可以使用std::atomic
这边走:
class A
{
int x;
public:
A()
{
x=0;
}
void Add()
{
x++;
}
void Sub()
{
x--;
}
};
在我的代码中:
std::atomic<A> a;
并在不同的线程中:
a.Add();
and
a.Sub();
但我收到一个错误a.Add()
尚不清楚。我该如何解决这个问题?
有没有更好的方法来做到这一点?
请注意,这是一个示例,我想要的是确保对 A 类的访问是线程安全的,所以我不能使用
std::atomic<int> x;
我怎样才能使用一个类线程安全std::atomic
?
你需要做x
属性是原子的,而不是整个类,如下所示:
class A
{
std::atomic<int> x;
public:
A() {
x=0;
}
void Add() {
x++;
}
void Sub() {
x--;
}
};
您在原始代码中遇到的错误是完全正常的:没有std::atomic<A>::Add
方法(参见here http://www.cplusplus.com/reference/atomic/atomic/?kw=atomic)除非您提供专业化std::atomic<A>
.
参考您的编辑:你不能神奇地让你的class A
通过使用它作为模板参数来保证线程安全std::atomic
。为了使其线程安全,您可以将其属性设置为原子属性(如上所述,并提供标准库为其提供专门化),或者使用互斥体自行锁定资源。请参阅mutex http://www.cplusplus.com/reference/mutex/标头。例如:
class A
{
std::atomic<int> x;
std::vector<int> v;
std::mutex mtx;
void Add() {
x++;
}
void Sub() {
x--;
}
/* Example method to protect a vector */
void complexMethod() {
mtx.lock();
// Do whatever complex operation you need here
// - access element
// - erase element
// - etc ...
mtx.unlock();
}
/*
** Another example using std::lock_guard, as suggested in comments
** if you don't need to manually manipulate the mutex
*/
void complexMethod2() {
std::lock_guard<std::mutex> guard(mtx);
// access, erase, add elements ...
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)