classs A{ int x;public: A() { x=0; } voID Add() { x++; } voID Sub() { x--; } };
在我的代码中:
std::atomic<A> a;
并在不同的线程:
a.Add();
和
a.Sub();
但是当我收到错误,a.Add()不知道.我该如何实现?
有什么更好的办法吗?
编辑1
请注意,这是一个示例,我想要的是确保访问类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>提供专业化,否则没有std :: atomic< A> :: Add方法(请参阅here).
参考你的编辑:通过使用它作为std :: atomic的模板参数,你不能神奇地使你的类线程安全.为了使其线程安全,您可以将其属性原子化(如上所述,并提供标准库为其提供专业化),或使用互斥锁自动锁定资源.请参阅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 ... }};总结
以上是内存溢出为你收集整理的c – 如何使用std :: atomic <>全部内容,希望文章能够帮你解决c – 如何使用std :: atomic <>所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)