linux 读写锁 pthread_rwlock

news2024/10/7 14:23:55

  

  • 专栏内容:linux下并发编程
  • 个人主页:我的主页
  • 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

目录

前言

概念介绍

应用场景

接口说明

头文件

rwlock定义

初始化/销毁

两种初始化方式

rwlock资源进行销毁

常见错误

属性设置

属性初始化/销毁

共享属性

阻塞式加锁

非阻塞加锁

编程示例

结尾


前言

本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。


概念介绍

        与前面介绍的互斥量,信号量类似,用于多线程/进程间同步控制,但与它们的不同之处在于,读写锁可以区分读加锁和写加锁,也就是说一把锁有两种不同的加锁方式,那么对于两种加锁方式下的并发控制也是不同。

这个不同点,也就是读写锁的精妙的所在。

应用场景

读写锁,有两种加锁方式:

(1)加读锁,也就是共享锁,多个并发可以同步加此种锁,同时可以访问临界区。

(2)加写锁,也就是独占锁,只有一个并发可以成功的加写锁,此时其它并发既不能加写锁,也不能加读锁,这就是独占的意义。

如下图所示:

 

基于rwlock的这个特点,在大并发中,读取临界区任务数量远远大于写临界区数量时,对于读任务只加共享读锁即可,比互斥量/信号量的性能会远远超过。

比如在系统中的用户信息,在每个并发登陆时都会访问,但它们大多数是只读,这样就可以共享访问,只对于少数注册/修改加写锁,此时互斥访问即可。

接口说明

头文件

 #include <pthread.h>

rwlock定义

pthread_rwlock_t rwlock;

当然定义了还不能用,此时状态未知,必须初始化后才能用。

初始化/销毁

  • 两种初始化方式

一种调用初始化接口,可以对rwlock的属性进行自定义设置,如果attr=NULL时,也会采用默认行为初始化;

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

           const pthread_rwlockattr_t *restrict attr);

另一种采用静态初始化,此时采用的都是默认属性

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

默认初始化成功返回0,错误时查看errno,成功后状态为未加锁。

  • rwlock资源进行销毁

当然销毁的只是变量对应的资源,变量还可以再初始化;

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

  • 常见错误

几种未定义的行为,尽量避免踩坑:

(1)对还在加锁状态的rwlock进行销毁,行为没有定义,未知;

(2)对未初始化的rwlock进行销毁;

(3)多次初始化rwlock,可能会引起未知行为;

属性设置

  • 属性初始化/销毁

头文件为

#include <pthread.h>

定义rwlock属性变量

pthread_rwlockattr_t rwlock_attr;

初始化属性变量

int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

销毁属性变量资源

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

  • 共享属性

头文件为

#include <pthread.h>

获取和设置属性接口

int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr,

    int *pshared);

int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,

    int pshared);

默认初始化时,共享属性为PTHREAD_PROCESS_PRIVATE,也就是只能在单个进程间的多线程间使用。

如果要在多个进程间的线程间使用,就需要将属性设置为PTHREAD_PROCESS_SHARED,也就是能访问rwlock变量内存的线程都可以使用,进行并发控制。

阻塞式加锁

加读锁,如果其它任务已经加了写锁,此时会阻塞等待

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,如果其它任务已经加了写锁,此时会返回失败,不会阻塞

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

尝试加写锁,成功则返回0,如果其它任务已经加了写/读锁,此时会返回失败,不会阻塞

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

错误码有:

[EBUSY] 获取锁失败

[EDEADLK] 当前任务已经获得了锁

编程示例

[senllang@localhost ex04_process]$ make
mkdir -p ./build
gcc  -I./  -I./build -DTEST_PRO -lpthread -g -c ipc_shmem.c
gcc  -I./  -I./build -DTEST_PRO -lpthread -g -c ipc_rwlock.c
gcc  -I./  -I./build -DTEST_PRO -lpthread -g -c main.c
gcc  -I./  -I./build -DTEST_PRO -lpthread -g -c ipc_mutex.c
gcc  -I./  -I./build -DTEST_PRO -lpthread -g -c process.c
gcc  -I./  -I./build -DTEST_PRO -lpthread -g -c ipc_shmem.c
gcc  -I./  -I./build -DTEST_PRO -lpthread -g *.o -o hatch-0-01
[senllang@localhost ex04_process]$ ./hatch-0-01 3 1

启动3个进程,定义1个rwlock,其中第一个进程是写锁处理,后面进程是读锁处理;

代码工程hatchCode

代码位于gitcode,请大家关注,后面会持续更新到此仓库。


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。另外有什么想要了解的内容,也可以给我发邮件,互相谈讨,定知无不言。

注:未经同意,不得转载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法设计与智能计算 || 专题九: 基于拉普拉斯算子的谱聚类算法

谱聚类 文章目录 谱聚类1. 信息增益的度量2. 谱聚类: 寻找最优的函数向量 f \boldsymbol{f} f2.1 : 寻找一个最优的函数向量 f \boldsymbol{f} f2.2 寻找鲁棒性更强的多个函数向量2.3 谱聚类(spectral clustering)算法 小结 1. 信息增益的度量 由于数据集 X [ x 1 , x 2 ,…

自动化仓储管理系统(WMS)

仓储是现代物流的一个重要组成部分&#xff0c;在物流系统中起着至关重要的作用&#xff0c;是厂商研究和规划的重点。高效合理的仓储可以帮助厂商加快物资流动的速度&#xff0c;降低成本&#xff0c;保障生产的顺利进行&#xff0c;并可以实现对资源有效控制和管理。 随着我…

CVE-2023-27363 FOXIT PDF READER与EDITOR任意代码执行漏洞复现

目录 0x01 声明&#xff1a; 0x02 简介&#xff1a; 0x03 漏洞概述&#xff1a; 0x04 影响版本&#xff1a; 0x05 环境搭建&#xff1a; 文件下载&#xff1a; 0x06 漏洞复现&#xff1a; POC下载&#xff1a; 利用POC&#xff1a; RCE&#xff1a; 0x07 修复建议&a…

2023.5.21 第五十四次周报

目录 前言 文献阅读:跨多个时空尺度进行预测的时空 LSTM 模型 背景 本文思路 本文解决的问题 方法论 SPATIAL 自动机器学习模型 数据处理 模型性能 代码 用Python编写的LSTM多变量预测模型 总结 前言 This week, I studied an article that uses LSTM to solve p…

Kuberadm安装部署

目录 1、所需配置 2、准备环境 3、安装Docker 4、安装Kubeadm、Kubelet和Kuberctl 5、部署K8s集群 6、初始化kubeadm 7、设置kubecrl 8、部署网络插件flannel 测试 9、部署Dashboard 10、安装Harbor私有仓库 11、内核参数优化方案 1、所需配置 主机名系统要求IP地…

一款C#开发的窗口文本提取开源软件

窗体上的文字&#xff0c;我们是无法直接复制的&#xff0c;如果要获取&#xff0c;大家第一反应肯定是利用OCR&#xff0c;但是今天给大家推荐一个通过Hook原理来抓取文本的开源项目。 项目简介 这是一个基于.Net Framework开发的&#xff0c;功能强大的文本提取工具&#x…

【消息中间件】为什么要用消息中间件?解决了什么问题?

文章目录 前言一、什么是消息中间件&#xff1f;二、为什么使用&#xff1f;二、使用消息中间件前后对比三、当前几种中间件&#xff1a;四、使用消息中间件场景&#xff1a; 前言 一般认为&#xff0c;采用消息传送机制/消息队列 的中间件技术&#xff0c;进行数据交流&#…

[CISCN 2019华东南]Web4 day5

考察&#xff1a;任意文件读取 获取网卡地址 伪随机 打开界面&#xff0c;点击read somethings直接进行了跳转 直接修改url&#xff0c;发现没显示&#xff0c;但是访问错误的路由就会有no response 读取flag也无果&#xff0c;那就读一下/app/app.py&#xff0c;为什么读这个&…

postgresql|数据库|插件学习(二)---postgresql-12的外置插件pg_profile的启用和使用

前言&#xff1a; postgresql数据库有非常多的插件&#xff0c;那么&#xff0c;pg_profile算是监控类的插件&#xff0c;该插件会通过内置的pg_stat_statements插件和dblink插件这两个插件监控查询postgresql的状态&#xff0c;并可以通过打快照的方式得到awr报告。 ###注&a…

攻防世界 wife_wife

查看提示&#xff1a;不需要爆破 进入到靶场中&#xff0c;发现需要注册用户 到达注册页面&#xff0c;is admin需要打勾&#xff0c;并输入同样 burpsuite抓包 原来payload&#xff1a;{"username":"1","password":"1","isAdmin…

MySQL数据库---笔记2

MySQL数据库---笔记2 一、函数1.1、字符串函数1.2、数值函数1.3、日期函数1.4、流程函数 二、约束2.1、概述2.2、演示2.3、外键约束 一、函数 函数 是指一段可以直接被另一段程序调用的程序或代码。 1.1、字符串函数 函数功能CONCAT(S1,S2,…Sn)字符串拼接&#xff0c;将S1&…

分布式医疗云平台【基础功能搭建、数据表定义、ERP业务表、系统表、其它配置表 】(三)-全面详解(学习总结---从入门到深化)

基础功能搭建 创建数据库 数据表定义 ERP业务表 系统表 其它配置表 基础功能搭建 创建数据库 执行脚本&#xff0c;创建基础数据 数据表定义 业务表 his_care_order: 药用处方表&#xff0c;涉及的业务模块&#xff1a;处方收费、处方发药、新开检查 his_care_history…

jetson填坑-单独安装cuda,cudnn,tensorrt任意适用版本

前言 jetson无法单独安装cuda&#xff0c;cudnn&#xff0c;tensorrt的解决方法&#xff0c;比下载SDK manager刷机安装简单好多倍 这个方法是直接下载deb包安装&#xff0c;deb包安装网站 https://repo.download.nvidia.com/jetson/ 单独安装cuda 1 sudo apt-get install …

ArcMap:第一届全国大学生GIS应用技能大赛(滁州学院)详解

目录 01 上午题 1.1 题目 1.2 数据 1.2.1 如何添加比赛数据&#xff1f; 1.2.2 比赛数据展示 1.3 思路 1.3.1 坐标系问题 1.4 实操 1.4.1 建立空间数据库和比赛数据导入 1.4.2 坐标系问题解决 1.4.3 要素的订正 1.4.4 数据入库和符号化管理&#xff1b; 1.4.5 其…

C++ thread编程(Linux系统为例)—thread成员函数

c 11 之后有了标准的线程库&#xff1a;std::thread。 参考thread库的使用 构造函数 thread的构造函数有下面四个重载 默认构造函数 thread() noexcept初始化构造函数 template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... arg…

HP-800G4-DM 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板HP 800G4 DM 35W 处理器intel i5-9600T已驱动 内存Samsung DDR4 2666 32G*2已驱动 硬盘WD SN750 500G已驱动 显卡intel UHD 630已驱动 声卡瑞昱…

SpringBoot项目中Controller层、Service层、Dao层、entity层、Configuration层、Utils层作用

SpringBoot项目中各层的作用 1、Controller层2、Service层3、Dao层&#xff08;Mapper层&#xff09;4、entity层&#xff08;model层&#xff09;5、Configuration层6、Utils层各层作用架构图 1、Controller层 Controller层为控制层&#xff0c;一般使用 RestController 或 C…

【Linux入门】Linux指令(2)

【Linux入门】Linux指令(2) 目录 【Linux入门】Linux指令(2)时间相关的指令cal指令find指令&#xff08;重要&#xff0c;选项很多&#xff09;-namegrep指令zip/unzip指令tar指令&#xff08;重要&#xff09;bc指令uname -r指令重要的几个热键[Tab],[ctrl]-c, [ctrl]-d关机&a…

车载软件架构——闲聊几句AUTOSAR OS(一)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是,他们想…

transformers两个入门示例

根据《attention is all you need》论文而形成的transformers框架在chat-gpt应用中大放异彩&#xff0c;目前transformers框架已经成了炙手可热的框架。它不仅在nlp方面很作用很大&#xff0c;根据官网的介绍&#xff0c;它还可以做很多事情&#xff0c;比如图片分类&#xff0…