linux4种锁

2023-10-12 13:10
文章标签 linux4 种锁

本文主要是介绍linux4种锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正点原子教程笔记

原子锁

typedef struct {int counter;
} atomic_t;

定义的两种方式:

atomic_t a; //定义 a

atomic_t b = ATOMIC_INIT(0); //定义原子变量 b 并赋初值为 0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UPfTyjV-1623029967557)(https://i.loli.net/2021/02/01/gfAYOn1VBXv2ioW.png)]

原子锁的使用如下所示:

atomic_t v = ATOMIC_INIT(0); /* 定义并初始化原子变零 v=0 */
atomic_set(10); /* 设置 v=10 */
atomic_read(&v); /* 读取 v 的值,肯定是 10 */
atomic_inc(&v); /* v 的值加 1,v=11 */

64位的原子锁

typedef struct {long long counter; 
} atomic64_t;

函数与上面相同 替换为atomic64_

原子操作只能对整形变量或者位进行保护

原子位操作

原子位操作是直接对内存进行操作

自旋锁

  1. 自旋锁会自动禁止抢占,因此保护区间不允许有休眠的函数,如果其他线程使用了该锁,就会发生死锁,因为该线程休眠完之后,抢占不到CPU。

  2. 获取锁之前关闭本地中断,如果中断当中获取该锁,也会发生死锁。

typedef struct spinlock {union {struct raw_spinlock rlock;#ifdef CONFIG_DEBUG_LOCK_ALLOC# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))struct {u8 __padding[LOCK_PADSIZE];struct lockdep_map dep_map;};#endif};
} spinlock_t;

自旋锁使用示例:

DEFINE_SPINLOCK(lock) /* 定义并初始化一个锁 *//* 线程 A */
void functionA (){unsigned long flags; /* 中断状态 */spin_lock_irqsave(&lock, flags) /* 获取锁 *//* 临界区 */spin_unlock_irqrestore(&lock, flags) /* 释放锁 */
}/* 中断服务函数 */
void irq() {spin_lock(&lock) /* 获取锁 *//* 临界区 */spin_unlock(&lock) /* 释放锁 */
}

在自旋锁的基础上还衍生出了其他特定场合使用的锁

读写自旋锁

为读和写操作提供了不同的锁,一次只能允许一个写操作,也就是只能一个线
程持有写锁,而且不能进行读操作。但是当没有写操作的时候允许一个或多个线程持有读锁,可以进行并发的读操作

typedef struct {arch_rwlock_t raw_lock; 
} rwlock_t;


顺序锁

在读写锁的基础上衍生而来,实现同时读写,但是不允许同时进行并发的写操作。

typedef struct {struct seqcount seqcount;spinlock_t lock; 
} seqlock_t;

信号量

信号量可以使线程进入休眠状态

struct semaphore {raw_spinlock_t lock;unsigned int count;struct list_head wait_list;
};

信号量的使用如下所示:

struct semaphore sem; /* 定义信号量 */
sema_init(&sem, 1); /* 初始化信号量 */
down(&sem); /* 申请信号量 */
/* 临界区 */
up(&sem); /* 释放信号量 */

互斥锁

将信号量的值设置为 1 就可以使用信号量进行互斥访问了,互斥体—mutex更为专业。

struct mutex {/* 1: unlocked, 0: locked, negative: locked, possible waiters */atomic_t count;spinlock_t wait_lock;
};

互斥体的使用如下所示:

struct mutex lock; /* 定义一个互斥体 */
mutex_init(&lock); /* 初始化互斥体 */
mutex_lock(&lock); /* 上锁 */
/* 临界区 */
mutex_unlock(&lock); /* 解锁 */

Linux 内核还有很多其他的处理并发和竞争的机制,后续再学习。

这篇关于linux4种锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/196065

相关文章

虚拟机安装Red Hat Enterprise Linux4(不完整)

一、安装VMare Workstation (1)进行碎片整理 (2)安装VM9,选择Typical-change-建议重启 二、安装Red Hat Enterprise Linux4 (1)点击create a new Virtual Machine (3)选择Typical (4)选择 I will install the operating system later (5)选择Linnx (

JavaEE 初阶篇-深入了解 CAS 机制与12种锁的特征(如乐观锁和悲观锁、轻量级锁与重量级锁、自旋锁与挂起等待锁、可重入锁与不可重入锁等等)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 乐观锁与悲观锁概述         1.1 悲观锁(Pessimistic Locking)         1.2 乐观锁(Optimistic Locking)         1.3 区别与适用场景         2.0 轻量级锁与重量级锁概述

微软拥抱开源,Win10为啥要引入真Linux4.X内核?

来源 | 异步 | 文末赠书 2019 年微软 Build 开发者大会在雷德蒙德召开。继将 Bash shell、原生 OpenSSH、WSL 引入 Windows,以及在微软商店提供 Ubuntu、SUSE Linux 和 Fedora 等发行版,微软又宣布了一个重大的决定 —— 将完整的 Linux 内核引入 Windows 10。 按照微软的说法,到时 Windows 1

synchronized 中4种锁状态

4种锁状态:无锁,偏向锁,轻量级锁,重量级锁: 偏向锁:当一个线程访问加了同步锁的代码块时,会在对象头中存储当前线程ID,后续当这个线程再次进入/推出这段代码块的时候,不需要再次加锁和释放锁。而是直接比较对象头中是否存储了指向当前线程的偏向锁。如果相等表示偏向锁是偏向于当前线程的,就不需要再次尝试获得锁。 偏向锁的获取: 1、获取偏向锁对象的Markword,判断当前锁对象是否为