Linux 锁介绍

Linux 同步方法

1.原子操作

原子操作可以保证指令以原子的方式进行,执行过程中不被打断,通常用来对单个变量进行计数使用

头文件

#include <linux/types.h>

typedef struct {
	int counter;
} atomic_t;

#ifdef CONFIG_64BIT
typedef struct {
	long counter;
} atomic64_t;
#endif
初始化原子变量为0:
atomic_t x = ATOMIC_INIT(0);

1.32位原子操作

Linux 锁介绍

2.64位原子操作

Linux 锁介绍

3.原子位操作

Linux 锁介绍

2.自旋锁

自旋锁的作用是当某一段代码只能被单线程原子执行时,我们就可以用到自旋锁,如果一个线程试图获取一个已经被持有的自旋锁的时候,改线程会一直进行忙循环–旋转–等待锁重新可用(浪费处理器时间),如果锁未被使用,请求锁的线程可以立即得到该锁。

如果使用自旋锁自旋锁不应该被线程长时间持有,同一时刻只能有一个线程能持有锁

头文件

#include <linux/spinlock.h>
初始化lock
#define spin_lock_init(_lock)				\
do {							\
	spinlock_check(_lock);				\
	raw_spin_lock_init(&(_lock)->rlock);		\
} while (0)

Linux 锁介绍

3.读写锁

读写锁的作用:当需要并发的对数据进行读操作,可以使用到读写锁中的读锁,而写锁只能由一个获取,也就是说多线程并行读时,可以使用读锁

使用读锁后没释放读锁不能使用写锁,同一时刻只能有一个线程能持有写锁

头文件

#include <linux/rwlock.h>

初始化
#define DEFINE_RWLOCK(x)

Linux 锁介绍

4.信号量

信号量是一个睡眠锁,当一个任务获取一个被占用的信号量时,信号量会将该任务放入等待队列。cpu转去做其他任务,当忙信号量被释放后,任务重新被激活

信号量用于处理锁可能长时间睡眠时,可以使用该锁。

同一时刻持有锁的任务数可以由计数信号量指定。内核一般都是用计数为一的数值,也就是同一时刻只能由一个任务可以持有锁

头文件

#include <linux/semaphore.h>

struct semaphore sem;
sema_init(struct semaphore *sem, int val) //val->count

Linux 锁介绍

5.读写信号量

读写信号量与读写锁性质差不多。读写信号量都是互斥信号量,只要没有写者,并发获取读锁的读者不限,只有唯一写者

头文件

#include <linux/rwsem.h>

6.互斥体

实现互斥特定睡眠锁,是一个互斥体,任何时刻只有一个任务可以获取互斥体,互斥体不能在中断或者下半部中使用

文件

#include <linux/rwsem.h>

Linux 锁介绍

上一篇:2021牛客多校#5 B-Boxes


下一篇:Mysql Innodb 锁、事务笔记【待整理】