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

前端之家收集整理的这篇文章主要介绍了c – 如何使用std :: atomic <>前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个类,我想在不同的线程中使用它,我想我可以使用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&C++相关文章