原子操作详解

版权声明:本文为博主原创文章,未经博主允许不得转载 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
  1. 常用操作函数
  2. 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,不可能是其他数据。

代码中更多强调的是顺序要求,即要求读必须在写之后发生,这种需求属于顺序要求。原子性确保指令执行期间不会被打断,要么执行完,要么根本不执行,顺序性确保两条指令必须按照约定好的顺序执行,不管处在什么环境下

猜你喜欢

转载自blog.csdn.net/qq_37600027/article/details/84000140