首页 > 编程知识 正文

字符串核函数,exec函数

时间:2023-05-05 01:00:45 阅读:172232 作者:485

Linux--原子操作1、原子操作1.1、概念1.2、事例1.3、原子操作结构体介绍1.4、原子操作的使用1.4.1、定义1.4.2、初始化1.5、原子整形操作API函数1.5.1、事例1.6、原子位置操作API函数

1、原子操作1.1、概念

原子操作指示原子执行,中途不中断。 就像原子被认为是不可分割的粒子一样,原子操作(atomic operation )是不可分割的操作。

1.2、事例现在,假设给无符号整形变量a赋值,值为3,对c语言来说很简单,直接是。

虽然a=3,但c语言首先被编译成汇编指令。 ARM体系结构不支持直接对寄存器的读写操作,如使用寄存器R0、R1等完成赋值操作。 假设变量a的地址为0X3000000,则名为“a=3”的c语言行可能会编译为类似以下内容的汇编代码:

ldr r0,=0X30000000 /*变量a地址*/ldr r1,=3 /*写入值*/str r1,[r0] /*写入a变量*/从上述代码可知,在c语言中,单纯的" */ldr r1," 理想的执行顺序如下图所示。

理想的情况是,如上图所示,a线程给a分配30,b线程给a分配30。

但是,这一共是6个句子,如果实际执行的话,有可能是:

线程a最终将变量a设置为30而不是请求的3! 线程b没有问题。 这是同时设置变量值和冲突的最简单示例,要解决此问题,必须确保示例代码中的三行汇编指令作为一个整体执行,即以原子形式存在。 Linux内核提供了一组实现此功能的原子操作API函数。 Linux内核提供了一组用于操作整形变量的原子操作API函数和一组用于操作对齐的原子操作API函数。 让我们来看看这些API函数。

1.3、原子操作结构介绍Linux内核定义一个名为atomic_t的结构完成数据整形的原子操作,使用过程中用原子变量代替整形变量。 该结构体定义是include/linux/types.h文件,定义如下。

/*32位系统下*/typedef struct {int counter; } atomic_t; /*64位系统下*/# ifdef config _ 64 bittypedefstruct { long counter; } atomic64_t; #endif 1.4、原子操作的使用1.4.1、atomic_t a的定义; //定义a 1.4.2,初始化可以通过宏ATOMIC_INIT为原子变量指派初始值。

atomic_ta=atomic_init(0; //定义原子变量a,将初始值代入0 1.5。 原子整形操作API函数操作读取、写入、增加、减少等原子变量。 Linux内核提供大量的原子操作API函数,如下表所示。

API的含义atomic_init(inti )在定义原子变量时初始化。 intatomic_read(atomic_t*v )读取并返回v的值。 voidatomic_set(atomic_t*v,int i )向v写入I值。 voidatomic_add(intI,atomic_t *v ) )在v上加上I值。 voidatomic_sub(intI,atomic_t *v ) )从v中减去I值。 voidatomic_Inc(atomic_t*v )对v加1,即自增加。 voidatomic_dec(atomic_t*v )从v中减去1,即自相减intatomic_dec_return ) atomic_t*v从v中减去1,然后返回v的值。 int atomic _ Inc _ return (atomic _ t * v )将v加1,然后返回v的值。 intatomic_sub_and_test(intI, atomic_t *v )从v中减去I,如果结果为0,则返回真,否则返回假intatomic_dec_and_test ) atomic_t *v,否则返回假int atomic _ id 否则,返回假intatomic_add_negative ) intI,atomic_t*。否则,与返回假相对应,还提供了64位原子变量的操作API函数,这里不再详细说明。 与表中的API函数的用法相同,只是将“atomic_”前缀替换为“atomic64_”,将int替换为长整型。 如果使用64位SOC,请使用64位原子操作函数。

1.5.1、情况atomic_tv=atomic_init(0; /*定义原子为零的v=0*/atomic_set(10 )并初始化; 设置/*v=10*/atomic_read(v )/*要读取的v的值必须为10*/atomic_Inc(v ); /* v的值加1,v=11 */1.6,原子位操作API函数位操作也是常用的操作。 Linux内核也提供了一系列原子位操作API函数,但原子位操作不像原子整形变量那样具有atomic_t的数据结构,原子位操作直接操作内存。 API函数如表所示。

API描述voidset_bit(intnr,void *p )作为p地址的第NR位置1。 voidclear_bit(intnr,void *p ) )清除p地址的第NR位。 voidchange_bit(intnr,void *p )反转p地址的第NR位。 inttest_bit(intnr,void *p )获得p地址的第NR比特的值。 inttest_and_set_bit(intnr,void *p )返回nr位的原始值,p地址的第nr个位置为1。 inttest_and_clear_bit(intnr,void *p ) )清除p地址的第nr位,并返回nr位的原始值。 inttest_and_change_bit(intnr,void *p ) )反转p地址的第nr比特,返回nr比特的原始值。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。