【Linux操作系统】Linux系统编程中的读写锁

news2024/12/23 22:33:52

文章目录

    • 1.读写锁的原理
    • 2.提供的操作函数
    • 示例代码
    • 4.示例解释


1.读写锁的原理

读写锁(Read-Write Lock)是一种特殊的锁机制,用于在多线程环境下对共享资源进行读写操作。与互斥锁不同,读写锁允许多个线程同时读取共享资源,但只允许一个线程进行写操作。读写锁可以提高并发性能,适用于读操作比写操作频繁的场景。


2.提供的操作函数

在Linux系统编程中,读写锁的相关函数也是通过pthread库提供的。常用的读写锁相关函数有:

  1. pthread_rwlock_init函数的作用是初始化读写锁。
    • 原型:int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
    • 参数:
      • rwlock:指向要初始化的读写锁变量的指针。
      • attr:指向读写锁属性的指针,通常设置为NULL
    • 返回值:成功时返回0,失败时返回错误码。

  1. pthread_rwlock_destroy函数的作用是销毁读写锁。
    • 原型:int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
    • 参数:
      • rwlock:指向要销毁的读写锁变量的指针。
    • 返回值:成功时返回0,失败时返回错误码。

  1. pthread_rwlock_rdlock函数的作用是获取读锁。
    • 原型:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
    • 参数:
      • rwlock:指向要获取读锁的读写锁变量的指针。
    • 返回值:成功时返回0,失败时返回错误码。

  1. pthread_rwlock_wrlock函数的作用是获取写锁。
    • 原型:int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
    • 参数:
      • rwlock:指向要获取写锁的读写锁变量的指针。
    • 返回值:成功时返回0,失败时返回错误码。

  1. pthread_rwlock_unlock函数的作用是释放读锁或写锁。
    • 原型:int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
    • 参数:
      • rwlock:指向要释放的读写锁变量的指针。
    • 返回值:成功时返回0,失败时返回错误码。

示例代码

#include <stdio.h>
#include <pthread.h>

pthread_rwlock_t rwlock;
int shared_data = 0;

void* reader_func(void* arg) {
    pthread_rwlock_rdlock(&rwlock);
    printf("Reader %ld read shared data: %d\n", (long)arg, shared_data);
    pthread_rwlock_unlock(&rwlock);
    return NULL;
}

void* writer_func(void* arg) {
    pthread_rwlock_wrlock(&rwlock);
    shared_data += 1;
    printf("Writer %ld wrote shared data: %d\n", (long)arg, shared_data);
    pthread_rwlock_unlock(&rwlock);
    return NULL;
}

int main() {
    pthread_rwlock_init(&rwlock, NULL);

    pthread_t reader_thread1, reader_thread2, writer_thread;
    pthread_create(&reader_thread1, NULL, reader_func, (void*)1);
    pthread_create(&reader_thread2, NULL, reader_func, (void*)2);
    pthread_create(&writer_thread, NULL, writer_func, (void*)1);

    pthread_join(reader_thread1, NULL);
    pthread_join(reader_thread2, NULL);
    pthread_join(writer_thread, NULL);

    pthread_rwlock_destroy(&rwlock);

    return 0;
}

4.示例解释

在上述代码中,我们使用pthread_rwlock_init函数初始化了一个读写锁,然后创建了两个读线程和一个写线程。读线程通过pthread_rwlock_rdlock函数获取读锁,写线程通过pthread_rwlock_wrlock函数获取写锁,然后进行相应的读写操作。最后,通过pthread_rwlock_unlock函数释放锁,并通过pthread_rwlock_destroy函数销毁读写锁。


在这里插入图片描述

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

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

相关文章

多图详解VSCode搭建Java开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

JavaSE学习——异常

目录 一、异常概述 二、异常的体系结果 二、异常的处理&#xff1a;抓抛模型 三、try-catch-finally的使用 四、throws 异常类型 的使用 五、开发中如何选择使用try-catch-finally还是使用throws&#xff1f; 六、自定义异常 自定义异常步骤&#xff1a; 七、总结&a…

Android 13 - Media框架(7)- NuPlayer::Source

Source 在播放器中起着拉流&#xff08;Streaming&#xff09;和解复用&#xff08;demux&#xff09;的作用&#xff0c;Source 设计的好坏直接影响到播放器的基础功能&#xff0c;我们这一节将会了解 NuPlayer 中的通用 Source&#xff08;GenericSource&#xff09;关注本地…

MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)

目录 概述 多表关系 一对多&#xff08;多对一&#xff09; 多对多 一对一 多表查询概述 概念 笛卡尔积 分类 多表查询 多表关系多表查询概述内连接外连接自连接子查询多表查询案例 概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及…

框架分析(6)-Ruby on Rails

框架分析&#xff08;6&#xff09;-Ruby on Rails 专栏介绍Ruby on Rails核心概念以及组件讲解MVC架构模式约定优于配置强大的ORM支持自动化测试丰富的插件生态系统RESTful路由安全性总结 优缺点优点快速开发简单易学MVC架构强大的ORM支持大量的插件和Gem支持 缺点性能问题学习…

【Go 基础篇】Go语言数组遍历:探索多种遍历数组的方式

数组作为一种基本的数据结构&#xff0c;在Go语言中扮演着重要角色。而数组的遍历是使用数组的基础&#xff0c;它涉及到如何按顺序访问数组中的每个元素。在本文中&#xff0c;我们将深入探讨Go语言中多种数组遍历的方式&#xff0c;为你展示如何高效地处理数组数据。 前言 …

从零做软件开发项目系列之六——软件测试

前言 软件测试是指在软件开发过程中对软件系统进行验证和验证的过程。它的目的是确保软件能够按照设计要求正常运行&#xff0c;同时检测和纠正可能存在的缺陷和问题。软件测试有助于提高软件质量、可靠性和用户满意度。 1 测试阶段 软件测试阶段是软件开发过程中的重要环节…

【电源专题】18650圆柱电芯内部结构及器件

18650圆柱锂离子电池是一种直径为18mm、高度为65mm的锂离子电池,它最大的特点是拥有非常高的能量密度,它是比较成熟的锂离子电池,各方面系统质量稳定性较好,广泛适用于10千瓦时左右的电池容量场合,例如在、在手机、笔记本电脑等小型电器上。 常见的18650电池分为锂离子电池…

【IMX6ULL驱动开发学习】09.Linux之I2C驱动框架简介和驱动程序模板

参考&#xff1a;Linux之I2C驱动_linux i2c驱动_风间琉璃•的博客-CSDN博客​​​​​​ 目录 一、I2C驱动框架简介 1.1 I2C总线驱动 1.2 I2C设备驱动 二、I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 2.3 I2C 设备数据收发和处理 三、Linux I2C驱动程序模板…

自然语言处理: 第十章GPT的API使用

理论基础 现在的以GPT为首的生成类模型&#xff0c;它拥有对话的能力&#xff0c;它会根据你输入的暗示(prompt)或者指令(instruct)生成对应的回答。所以&#xff0c;不同的输入会导致不同的输出(其实由于chatgpt最终生成的答案是beam_search 以及随机采样的机制&#xff0c;所…

自定义Chronometer实现定时器

概述 自定义Chronometer实现定时器,引用方便&#xff0c;操作简单。 详细 前言 在Android开发过程中&#xff0c;计时控件是经常回使用到的&#xff0c;在Android控件库中有一个能快捷实现计时功能的控件&#xff0c;它就是Chronometer&#xff0c;今天我们基于它自定义实现…

LLM - Model Load_in_8bit For LLaMA

一.引言 LLM 量化是将大语言模型进行压缩和优化以减少其计算和存储需求的过程。 博主在使用 LLaMA-33B 时尝试使用量化加载模型&#xff0c;用传统 API 参数控制量化失败&#xff0c;改用其他依赖尝试成功。这里先铺下结论: ◆ Load_in_8bit ✔️ ◆ Load_in_4bit ❌ 二.LL…

基于SpringBoot+MybatisPlus+Shiro+mysql+redis智慧云智能教育平台

基于SpringBootMybatisPlusShiromysqlredis智慧云智能教育平台 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 声明&#xff1a;Java智慧云智能教育平台源码 前后端分离、 开发语言&#xff1a;JAVA 数据库&#xff1a;MySQL5.7以上 开发工具&#xff…

08 通过从 库1 复制 *.ibd 到 库2 导致 mysql 启动报错

前言 呵呵 最近同事有这样的一个需求 需要将 库1 的一张表 复制到 库2 然后 我想到了 之前一直使用的通过复制这个库的 data 文件来进行数据迁移的思路, 是需要复制这个 库对应的 data 目录下的数据文件, 以及 ibdata1 文件 然后 我又在想 这里的场景能否也使用这里的额方式…

基于树莓派设计的酒店房间号智能识别系统(图像识别)

基于树莓派4B设计的酒店房间号智能识别系统(图像识别) 一、设计需求 酒店房间识别系统的主要目的是:通过图像处理技术,以机器视觉的方式识别光学传感器传回的酒店房间图像中的数字,该系统可以以非接触的方式,以图像的方式获得需要的酒店房间读数,这能极大提高老式的酒店房…

ssp offer技巧 | 面试经验专栏介绍 | 金九银十

前言&#xff1a;欢迎来到我的面试经验专栏&#xff01;在这个专栏中&#xff0c;我将与大家分享我在多个领域的面试经验&#xff0c;涵盖Java、GO、操作系统、Mysql、计算机网络、Redis等领域。作为一名经验丰富的技术人员&#xff0c;我将通过文章的形式&#xff0c;为大家提…

基于SpringBoot的在线聊天系统

基于SpringBoot的在线聊天系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 源码编号&#xff1a;F-S03点击查看 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SpringBoot的在线聊天系统 项目架构&#xff1a;B/S架构 开发语言&#x…

【【萌新的STM32学习-16中断的基本介绍1】】

萌新的STM32学习-16中断的基本介绍1 中断 什么是中断 中断是打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续执行&#xff0c;就叫中断 中断的作用 实时控制 &#xff1a; 就像对温度进行控制 故障控制 &#xff1a; 第一时间对突发情…

谷歌浏览器的受欢迎之谜:探析其引人入胜的特点

文章目录 &#x1f340;引言&#x1f340;1. 极速的浏览体验&#x1f340;2. 简洁直观的界面&#x1f340;3. 强大的同步功能&#x1f340;4. 丰富的扩展生态系统&#x1f340;5. 安全与隐私的关注&#x1f340;6. 持续的技术创新&#x1f340;7. 跨平台支持和云整合&#x1f3…

《机器学习核心技术》分类算法 - 决策树

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 决策树 1、决策树API2、决策时实际应用2.1、获取数据集2.2、划分数据集2.3、决策…