c语言中的原子操作

摘要:
分为位和整型变量两类原子操作。typedefstruct{volatileintcounter;}atomic_t;2.原子操作函数分为整形原子操作和位原子操作3.整型原子操作:voidatomic_set;//设置原子变量v的值为iatomic_tv=ATOMIC_INIT;//定义原子变量v,并初始化为0atomic_read;//获得原子变量的值,返回原子变量的值voidatomic_add;//原子变量+ivoidatomic_sub;//原子变量-ivoidatomic_inc;//原子变量+1voidatomic_dec;//原子变量-1对原子变量执行自增,自减和减操作后,测试其是否为0,为0则返回true,否则返回false:intatomic_inc_and_test;intatomic_dec_and_test;intatomic_sub_and_test;对原子变量进行加/减,自增/自减操作,并返回新的值:intatomic_add_return;intatomic_sub_return;intatomic_inc_return;intatomic_sub_return;intatomic_add_unless;(v!

参考文章:https://blog.csdn.net/yikai2009/article/details/8650221

1. 原子操作:
原子操作指的是在执行过程中不会被别的代码所中断的操作.。分为 位 和 整型变量 两类原子操作。

typedef struct { volatile int counter; } atomic_t;

2. 原子操作函数 分为 整形原子操作 和 位原子操作

3. 整型原子操作:

void atomic_set(atomic_t *v, int i); //设置原子变量v的值为i

atomic_t v = ATOMIC_INIT(0); //定义原子变量v, 并初始化为0

atomic_read(atomic_t *v); //获得原子变量的值,返回原子变量的值

void atomic_add(int i, atomic_t *v); //原子变量+i

void atomic_sub(int i, atomic_t *v); //原子变量-i

void atomic_inc(atomic_t *v); //原子变量+1
void atomic_dec(atomic_t *v); //原子变量-1

对原子变量执行自增,自减和减操作后 ,测试其是否为0,为 0 则返回 true,否则返回 false :

int atomic_inc_and_test(atomic_t *v);

int atomic_dec_and_test(atomic_t *v);

int atomic_sub_and_test(int i, atomic_t *v);

对原子变量进行加/减,自增/自减操作,并返回新的值:

int atomic_add_return(int i, atomic_t *v);

int atomic_sub_return(int i, atomic_t *v);

int atomic_inc_return(atomic_t *v);

int atomic_sub_return(atomic_t *v);

int atomic_add_unless(atomic_t *v, int a, int u); ( v!=u ) ? v+a,返回非0值 : 0;

int atomic_inc_not_zero(atomic_t *v); ( v!=0 ) ? v+1,返回非0值 : 0;

atomic_dec_not_one() 这是一个宏,不等于1,返回非0值;等于1,返回0

4. 位原子操作:
void set_bit(nr, void *addr); //将addr地址的nr位 置为1

void clear_bit(nr, void *addr); //将addr地址的nr位 置为0

void change_bit(nr, void *addr); //对addr地址的nr位 反置

int test_bit(nr, void *addr); //返回addr地址的nr位

int test_and_set_bit(nr, void *addr); //将*addr 的第n位设置成1,并返回原来这一位的值

int test_and_clear_bit(nr, void *addr); //将*addr 的第n位设置成0,并返回原来这一位的值

int test_and_change_bit(nr, void *addr);

免责声明:文章转载自《c语言中的原子操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 5.0 以上监听网络变化多线程之旅六——异步编程模式,自己实现IAsyncResult下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c语言:百元白鸡问题

#include<stdio.h>#include<math.h>int main(){ //设公鸡,母鸡,鸡仔各x,y,z只;  int x,y,z; for(x=0;x<=20;x++) {  for(y=0;y<=33;y++)  {   for(z=3;z<=300;z+=3)   {    if(((x+...

C语言Windows程序开发—TextOut函数介绍【第02天】

(一)TextOut函数的参数介绍: 1 BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE 2 HDC hdc, //用于显示字符串的控件ID 3 int nXStart, //字符串所在起始位置左上角...

《Qt数据类型》--QByteArray,QString,int,hex之间的转化

对于QString和QByteArray,他们都有一个toInt的静态函数,QString::toInt()是根据string的字面值转化为int类型,比如string:"123",转化为int类型就变为int:123。而对于QByteArray::toInt()是将16进制的数据转化为10进制之后得到int类型,比如byte:0xf8-->dec:...

C语言实现进度条

C语言实现进度条 学观察者模式时想实现一个进度条通知实例,花了一些时间,记录下来吧。 #include <stdio.h> #include <iostream> #include <windows.h> void DoProgress(int t, int n) { putchar('['); for...

iOS开发-OC语言 (一)oc数据类型

分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型、指针数据类型 基本数据类型:数值型、字符型(char)、布尔型、空类型(void) 指针数据类型:类(class)、id 数值型:整数类型int、浮点型float、double c和oc的基本数据类型 int:声明整型变量 double:声明双精度变量 f...

C#与C++数据类型比较及结构体转换[整理]

//c++:HANDLE(void   *)                          ----    c#:System.IntPtr//c++:Byte(unsigned   char)                     ----    c#:System.Byte//c++:SHORT(short)                   ...