我应该使用std :: atomic还是std :: mutex以避免线程竞争?

时间:2019-04-13 20:49:24

标签: c++ multithreading

在这种特定情况下,避免数据竞争的更好方法是什么?

我正在编写一个程序,其中一个类具有一些变量,并创建一个分离的(异步/并行)线程以在无限的while循环中更新其私有变量。另外,此类具有在主线程中不时访问其私有变量的函数:

#include "UART.h"
class Example
{
private:
  double x;
  double y;
  UART &uart;
public:
  Example::Example(UART u) : uart(u), x(0), y(0) {};

  void Example::run()
  {
     while(1)
     {
         x = uart.read() // Here x is being filled with some other values
     }
  }

  void Example::getX()
  {
     // Data race
      y = this->x*2;
   }
};

int main(int argc, char** argv)
{
  Example example(u);
  std::thread t1(&Example::run, example);
  t1.detach();

  example.getX();
}

那么对于上面的代码,有什么更好的解决方案来避免数据争用和x的未定义行为?

函数mutex中是否有getx()

// mtx will be created in Example private member sector
void Example::getX()
{
   mtx.lock();
   y = this->x*2;
   mtx.unlock();
}

还是将x设为原子原子更好?

std::atomic<double> x;

1 个答案:

答案 0 :(得分:1)

这里atomic足够了,memory_order_relaxed(而不是简单的赋值)就足够了,因为不需要其他任何线程的内存写操作。