首页 > 技术文章 > 同步互斥阻塞

liuqing520 2020-04-14 11:18 原文

1、原子操作

         指在执行过程中不会被别的代码路径所中断的操作

常用函数:

@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返回ture,否则返回false

 

2、信号量

         用于保护临界区的常用方法,只有得到信号量的进程才能执行临界区代码

当获取不到信号量时,进程进入休眠等待状态。

同时的两个程序,第一个是获取了信号量后,第二个进入程序会休眠。

只能等到第一个进程结束后才能开始进程

定义信号量:

@struct semaphore sem;

初始化信号量:

@void sema_init(struct semaphore *sem,int val);

  void init_MUTEX(struct semaphore *sem); //初始化为0

获得信号量:

@void down(struct semaphore *sem);

int down_interruptible(struct semaphore *sem);

int down_trylock(struct semaphore *sem);

释放信号量

@void up(struct semaphore *sem);

 

3、阻塞

         指在执行设备操作时若不能获得资源则挂起进程,直到满足条件后再进行操作。

         被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待条件被满足。

非阻塞操作

进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停查询,直至可以进行操作为止。

fd = open(“…”,  O_RDWR | ONONELOCK);

推荐阅读