原子变量和原子操作

1、什么是原子变量和原子操作
原子操作是指不会被线程调度机制打断的操作;原子操作一旦开始,就一直运行到结束,中间不会切换到任何别的进程。
原子变量是原子操作的基本单位。

2、原子变量和原子操作的功能是什么
在多进程(线程)访问共享资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。
例如,atomic_bool,atomic_int等等,如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证,多个线程访问这个共享资源的正确性。从而避免了锁的使用,提高了效率。
定义一个变量,将对一个变量值的读取、修改、回写变成一个不可打断的操作,这个变量就是原子变量。

3、原子变量和原子操作的应用
常用原子操作函数举例:

		atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0
		atomic_**read**(atomic_t *v); //返回原子变量的值
		void atomic_**inc**(atomic_t *v); //原子变量增加1
		void atomic_**dec**(atomic_t *v); //原子变量减少1
		int atomic_**dec_and_test**(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false。

常见的原子操作举例:

		#define atomic_**read**(v) ((v)->counter) //读取v指向的原子变量的值
		#define atomic_**set**(v,i) (((v)->counter) = (i)) //设置v指向的原子变量的值为i。
		static *__inline__* void atomic_**sub**(int i,atomic_t *v)  //从v指向的原子变量减去i。
		static __inline__ void atomic_**inc**(atomic_t *v) //递增v指向的原子变量。

C++11下的用法:

		#include
		atomic_int count(0);//声明并初始化

4、方法

getAndSet - >原子设置为给定值并返回上一个值。

compareAndSet - >”如果当前值==期望值,则以原子方式将值设置为给定的更新值。

getandincrement :得到当前值,并自增一。https://blog.csdn.net/camelcanoe/article/details/85099337

incrementAndGet:

通过源码分析可知,incrementAndGet()和 getAndIncrement ()都调用了 Unsafe 类中的 getAndAddInt() 方法,区别是:

① 前者,先+1,再返回

② 后者,先返回,再 +1

你可能感兴趣的:(C++,原子操作,进程和线程)