C++_多线程:原子操作atomic


原子操作atomic

C++ 多线程:原子类型

有两个线程,一个要写数据,一个读数据,如果不加锁,可能会造成读写值混乱,使用std::mutex程序执行不会导致混乱,但是每一次循环都要加锁解锁是的程序开销很大。 为了提高性能,C++11提供了原子类型(std::atomic<T>),它提供了多线程间的原子操作,可以把原子操作理解成一种: 不需要用到互斥量加锁(无锁)技术的多线程并发编程方式。 它定义在<atomic>头文件中,原子类型是封装了一个值的类型,它的访问保证不会导致数据的竞争,并且可以用于在不同的线程之间同步内存访问。从效率上来说,原子操作要比互斥量的方式效率要高。

atomic类型原子操作宣告C++11来到了多线程和并行编程的时代。 相对于偏于底层的pthread库,C++通过定义原子类型的方式,轻松地化解了互斥访问共享数据的难题。

atomic的两个方法:load()//读取数据 store()//存储数据 fetch_add(val)//加法 fetch_sub(val)//减法 exchange()

可以用在指针对象上,但是只表示指针是原子类型,指针指向的数据不一定是,atomic<int *> ptr;

关于load、store的例子:

// atomic::load/store example
#include <iostream>       // std::cout
#include <atomic>         // std::atomic, std::memory_order_relaxed
#include <thread>         // std::thread

std::atomic<int> foo (0);

void set_foo(int x) {
  foo.store(x, std::memory_order_relaxed);     // set value atomically
}

void print_foo() {
  int x;
  do {
    x = foo.load(std::memory_order_relaxed);  // get value atomically
  } while (x==0);
  std::cout << "foo: " << x << '\n';  // 10
}

int main ()
{
  std::thread first (print_foo);
  std::thread second (set_foo, 10);
  first.join();
  second.join();
  return 0;
}

文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录