c – 如何使用std :: atomic <>

c – 如何使用std :: atomic <>,第1张

概述我有一个类,我想在不同的线程中使用它,我想我可以使用std :: atomic这样的: classs A{ int x;public: A() { x=0; } void Add() { x++; } void Sub() { x--; } }; 在我 我有一个类,我想在不同的线程中使用它,我想我可以使用std :: atomic这样的:
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 <>所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存