原子操作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的例子:
#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> foo (0);
void set_foo(int x) {
foo.store(x, std::memory_order_relaxed);
}
void print_foo() {
int x;
do {
x = foo.load(std::memory_order_relaxed);
} while (x==0);
std::cout << "foo: " << x << '\n';
}
int main ()
{
std::thread first (print_foo);
std::thread second (set_foo, 10);
first.join();
second.join();
return 0;
}
|