原子操作atomic
有两个线程,一个要写数据,一个读数据,如果不加锁,可能会造成读写值混乱,使用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;
}
转载:https://blog.csdn.net/m0_67623521/article/details/128401840
查看评论