版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qq_37600027/article/details/84000140
原子操作
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会被其他进程打断。它是其他内核同步方法的基石。编写代码时能使用原子操作的,就尽量不要用加锁机制,因为原子操作给系统带来的开销小。
一、原子整数操作
1、类型的定义
针对整数的原子操作只能对atomic_t类型的数据进行处理
typedef struct {
volatile int counter;
}atomic_t;
定义一个atomic_t类型的方式如下
atomic_t v; //定义v
Atomic_t u = ATOMIC_INIT(0); //定义u并且初始化位0
- 常用操作函数
-
atomic_set(&v,4); //设置v=4 atomic_add(&v,4); //设置v = v + 2 = 6 (增加指定数值) atomic_inc(&v,4); //设置v = v + 1 = 7(自增) atomic_dec_and_test(&v); //测试自减之后是否为0,为零返回true
原子性与顺序性的比较
在大部分的体系结构上,读取一个字本身就是一种原子操作,也就是说,在对一个字写入期间不可能同时完成读操作。所谓原子性就是这个道理:一个字长的读取总是原子性的发生,绝不可能对同一个字交错的进行写。即读操作要么在写之前完成没要么在写之后完成。
例:对一个整数初始化为32,然后又赋值为365,那么读取这个整数肯定是32或者是365,不可能是其他数据。
代码中更多强调的是顺序要求,即要求读必须在写之后发生,这种需求属于顺序要求。原子性确保指令执行期间不会被打断,要么执行完,要么根本不执行,顺序性确保两条指令必须按照约定好的顺序执行,不管处在什么环境下