iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >linux中各种锁机制的使用与区别详解
  • 572
分享到

linux中各种锁机制的使用与区别详解

linux锁机制linux中断机制linux内核锁机制 2022-06-04 22:06:37 572人浏览 泡泡鱼
摘要

前言: 相信需要了解这方面的知识的小伙伴,已经基本对进程间通信和线程间通信有了一定了解。例如,进程间通信的机制之一:共享内存(在这里不做详解):多个进程可同时访问同一块内存。如果不对访问这块内存的临界区进行互斥或者同步,

前言:

相信需要了解这方面的知识的小伙伴,已经基本对进程间通信和线程间通信有了一定了解。例如,进程间通信的机制之一:共享内存(在这里不做详解):多个进程可同时访问同一块内存。如果不对访问这块内存的临界区进行互斥或者同步,那么进程的运行很可能出现一些不可预知的错误和结果。

接下来我们了解三种常见的linux下的互斥操作—>

1.互斥锁(mutex)

特点:对于读者和写者来说。只要有一方获取了锁,另一方则不能继续获取,进而执行临界区代码。

创建锁:

有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER 来静态初始化互斥锁,

方法如下:


pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 

在LinuxThreads实现中,pthread_mutex_t是一个结构,而PTHREAD_MUTEX_INITIALIZER则是一个结构常量。

动态方式是采用pthread_mutex_init()函数来初始化互斥锁,api定义如下:


int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t*mutexattr) 

其中mutexattr用于指定互斥锁属性(见下),如果为NULL则使用缺省属性。 pthread_mutex_destroy ()用于注销一个互斥锁,API定义如下:


int pthread_mutex_destroy(pthread_mutex_t *mutex) 

锁操作主要包括加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个,不论哪种类型的锁,都不可能被两个不同的线程同时得到, 而必须等待解锁。对于普通锁和适应锁类型,解锁者可以是同进程内任何线程; 而检错锁则必须由加锁者解锁才有效,否则返回EPERM;对于嵌套锁,文档和实现要求必须由 加锁者解锁,但实验结果表明并没有这种限制,这个不同目前还没有得到解释。在同一进程中 的线程,如果加锁后没有解锁,则任何其他线程都无法再获得锁。


int pthread_mutex_lock(pthread_mutex_t *mutex) 
int pthread_mutex_unlock(pthread_mutex_t *mutex) 
int pthread_mutex_trylock(pthread_mutex_t *mutex)

pthread_mutex_trylock() 语义与pthread_mutex_lock()类似,不同的是在锁已经被占据时返回 EBUSY而不是挂起等待。
例如:单例模式下,线程安全的加锁:


class SingleTon 
{ 
public: 
static SingleTon* getInstance() 
{ 
pthread_mutex_lock(&mutex); 
if(mpSingle == NULL) 
{ 
mpSingleTon = new SingleTon(); 
} 
pthread_mutex_unlock(&mutex); 
return mpSingleTon; 
} 
private: 
SingleTon(){}; 
~SingleTon(){pthread_mutex_desttroy(&mutex,NULL);} 
static pthread_mutex_t mutex; 
static SingleTon * mpSingleTon; 
} 
pthread_mutex_t SingleTon::mutex = PTHREAD_MUTEX_INITIALIZER; 
SingleTon * SingleTon::mpSingleTon = NULL;

优点:

由一块能够被多个进程共享的内存空间(一个对齐后的整型变量)组成;这个整型变量的值能够通过汇编语言调用CPU提供的原子操作指令来增加或减少,并且一个进程可以等待直到那个值变成正数。 的操作几乎全部在应用程序空间完成;只有当操作结果不 一致从而需要仲裁时,才需要进入操作系统内核空间执行。这种机制允许使用的锁定原语有非常高的执行效率:由于绝大多数 的操作并不需要在多个进程之间进行仲裁,所以绝大多数操作都可以在应用程序空间执行,而不需要使用(相对高代价的)内核系统调
用。

2.读写锁

特点:读写锁适合于对数据结构的读次数比写次数多得多的情况.因为,读模式锁定时可以共享,以写 模式锁住时意味着独EzZTOdO占,所以读写锁又叫共享-独占锁.

初始化和销毁:


int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const 
pthread_rwlockattr_t *restrict attr); 
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); 

成功则返回0,出错则返回错误编号. 同互斥量以上,在释放读写锁占用的内存之前,需要先通过 pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.

读和写:


int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); 
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); 
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); 

成功则返回0,出错则返回错误编号.这3个函数分别实现获取读锁,获取写锁和释放锁的操作.获 取锁的两个函数是阻塞操作,同样,非阻塞的函数为:


int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); 
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); 

成功则返回0,出错则返回错误编号.非阻塞的获取锁操作,如果可以获取则返回0,否则返回 错误的EBUSY.

3.自旋锁

特点:轮询忙等待。

在单核cpu下不起作用:被自旋锁保护的临界区代码执行时不能进行挂起状态。会造成死锁
自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。

API:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

--结束END--

本文标题: linux中各种锁机制的使用与区别详解

本文链接: https://www.lsjlt.com/news/20063.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解java中各类锁的机制
    目录前言1. 乐观锁与悲观锁2. 公平锁与非公平锁3. 可重入锁4. 读写锁(共享锁与独占锁)6. 自旋锁7. 无锁 / 偏向锁 / 轻量级锁 / 重量级锁前言 总结java常见的锁...
    99+
    2024-04-02
  • 深入解析MySQL中的各种锁机制
    MySQL 各种锁详解一、引言在并发访问中,数据库需要使用锁来保护数据的一致性和完整性。MySQL 提供了多种类型的锁,包括共享锁、排他锁、意向共享锁、意向排他锁等。本文将使用具体的代码示例介绍并解析这些锁的使用方式和特点。二、共享锁(Sh...
    99+
    2023-12-21
    MySQL - 事务 - 行锁 - 表锁
  • Python中is与==的使用区别详解
    目录一、== 是比较两个对象的内容是否相等二、is 比较的是两个实例对象是不是完全相同三、使用is注意python对于小整数使用对象池存储问题四、使用is注意python关于字符串的...
    99+
    2024-04-02
  • 详解MySql中InnoDB存储引擎中的各种锁
    目录什么是锁InnoDB存储引擎中的锁锁的算法行锁的3种算法幻像问题锁的问题脏读不可重复读丢失更新死锁什么是锁 现实生活中的锁是为了保护你的私有物品,在数据库中锁是为了解决资源争抢的...
    99+
    2024-04-02
  • Java中生成随机数的4种方式与区别详解
    目录1.Random ① 基础使用② 优缺点分析③ 线程安全问题2.ThreadLocalRandom ① 基础使用 ② 实现原理 ③ 优缺点分析 ThreadLocalRandom...
    99+
    2024-04-02
  • 详解Spring中使用@within与@target的区别
    项目里用到@within时,出现了一些问题,使用@target就可以解决,但又会出现一些新的问题,因此本文探讨了在spring中,使用@within和@target的一些区别。 背景...
    99+
    2024-04-02
  • SpringBoot中注解@ConfigurationProperties与@Value的区别与使用详解
    目录注解@ConfigurationProperties 注解@Value 区别松散语法绑定: SpEl语法表示: JSR303数据校验: 复杂类型封装: 配置文件注入值数据校验 注...
    99+
    2024-04-02
  • 详解Java中$符的各种使用场景
    目录前言1. $符号七大应用场景1.1 内部类与匿名内部类1.2 Lambda表达式与方法引用1.3. 自动生成的字段与方法1.4. 自定义类名与变量名1.5. 生成的代码和工具1....
    99+
    2023-05-17
    Java $符使用场景 Java $符使用 Java $符
  • 详解Python中sorted()和sort()的使用与区别
    目录sort()方法是什么如何妙用sorted() 方法总结在 Python 中,你可以使用 sorted() 方法或 sort() 方法对数据进行排序。 在本文中,我将提供 sor...
    99+
    2024-04-02
  • node.js事件循环机制及与js区别详解
    目录一、是什么二、流程三、题目一、是什么 在浏览器事件循环(opens new window)中,我们了解到javascript在浏览器中的事件循环机制,其是根据HTML5定义的规范...
    99+
    2024-04-02
  • Go语言中的锁机制详解
    标题:Go语言中的锁机制详解 Go语言中的锁机制是一种用于并发编程的重要工具,通过锁机制可以保护共享资源,避免多个goroutine同时访问导致的数据竞争问题。在本文中,我们将深入探讨...
    99+
    2024-04-02
  • Vue3.x中使用element-plus的各种方式详解
    目录安装element-plus 方式一、全局引入element-plus方式二、单个组件中使用方式三、经过自己封装按需引入1.在项目的src目录下建一个文件夹 globa...
    99+
    2024-04-02
  • Node.js中path.resolve与path.join的区别与作用详解
    目录前言:关于 path.resolve() 的使用总结:关于 path.join() 的使用path.resolve与path.join的区别前言: 讲解之前,大致的讲解一下所涉及...
    99+
    2023-03-19
    nodejs path.resolve node.js path.join
  • e.target与e.currentTarget对象的使用区别详解
    目录背景冒泡 & 捕获addEventListenertarget & currentTargetfalsetrue区别背景 大家开发中经常会跟DOM的事件打交道,也...
    99+
    2024-04-02
  • 详解Vue中Computed与watch的用法与区别
    目录computedcomputed只接收一个getter函数computed同时接收getter函数对象和setter函数对象调试 ComputedwatchEffect立即执行 ...
    99+
    2024-04-02
  • 详解Java中String类的各种用法
    目录一、创建字符串二、字符、字节与字符串的转换1.字符与字符串的转换2.字节与字符串的转换三、字符串的比较1.字符串常量池2.字符串内容比较四、字符串查找五、字符串替换六、字符串拆分...
    99+
    2024-04-02
  • 详解vue各种权限控制与管理的实现思路
    本篇文章给大家带来了关于vue的相关知识,其中主要详细介绍了vue各种权限控制与管理的实现思路,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。一、 菜单权限菜单权限:控制用户在系统中能够看到哪些菜单项菜单权限指的就是后台系统中的左侧的菜...
    99+
    2023-05-14
    前端 Vue.js Vuex
  • 详解Python中range()与xrange()的区别
    目录前言返回类型记忆操作使用Speed前言 range() 和 xrange() 是两个函数,可用于在 Python的 for 循环中迭代一定次数。在 Python 3 中,没有 x...
    99+
    2024-04-02
  • Numpy中np.dot与np.matmul的区别详解
    目录作用相同的情况作用不同的情况作用相同的情况 在若两个array的维度均为两维的情况下,两个函数的结果是相同的,例如: a = np.array([i for i in range...
    99+
    2023-02-15
    Numpy np.dot与np.matmul Numpy np.dot Numpy np.matmul
  • 详解TypeScript中type与interface的区别
    目录类型别名 type接口 interfaceinterface和type的相似之处都可以描述 Object和FunctionTypeInterface二者都可以被继承interfa...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作