当前位置: 首页 > news >正文

pthread 读写锁使用详解

pthread 读写锁使用

  • 读写锁:提供了一种高效的机制来控制对共享资源的访问。允许多个线程同时读取共享资源,但只允许一个线程独占地写入访问。
  • 适用于读取远远超过写入的场景下,因为写入操作需要独占地访问资源,可能会影响读取操作的性能。

pthread_rwlock_init

  • 函数原型:

    int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
    
    • rwlock:指向要初始化的读写锁对象的指针。
    • attr:可选的指向读写锁属性对象的指针,可以为 NULL。
    • 返回值:成功返回 0,失败返回错误代码。
  • 用于初始化读写锁对象。

  • 使用读写锁时,应该先初始化再使用,最后再销毁。

pthread_rwlock_destroy

  • 函数原型:

    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
    
    • rwlock:指向要销毁的读写锁对象的指针。
  • 用于销毁一个读写锁对象,释放相关的资源。

  • 销毁读写锁之前,要确保没有任何线程正在持有该读写锁,否则会导致未定义的结果。

pthread_rwlock_rdlock

  • 函数原型:

    int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
    
    • rwlock: 指向要获取的读写锁对象的指针。
  • 用于获取读取锁。如果当前没有其他线程持有该锁对象的写入锁,则该函数成功返回0并立即返回;否则,该函数将阻塞等待直到写入操作完成,并且当前线程可以安全地读取共享资源。

  • 允许多个线程同时读取共享资源,但不允许写入操作。

pthread_rwlock_rwlock

  • 函数原型:

    int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
    
    • rwlock: 指向要获取的读写锁对象的指针。
  • 用于获取写入锁,如果当前没有其他线程持有该锁对象的任何锁,则该函数成功返回0并立即返回;否则,该函数将阻塞等待直到其他线程释放该锁,然后当前线程可以独占地修改共享资源。

pthread_rwlock_unlock

  • 函数原型:

    int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
    
    • rwlock: 指向要释放的读写锁对象的指针。
  • 释放指定的读写锁对象的读取锁或写入锁。如果当前线程没有持有该锁,则该函数的行为是未定义的。

示例

  • 以下示例演示了两个线程同时读取一个变量,一个线程独占地修改变量:

    #include <stdio.h>
    #include <string.h>
    #include <pthread.h>pthread_rwlock_t g_rwlock;void* thread1_func(void* arg)
    {int *var = (int*)arg;// 获取读取锁pthread_rwlock_rdlock(&g_rwlock);printf("thread1 read var is %d\n", *var);// 释放读取锁pthread_rwlock_unlock(&g_rwlock);return NULL;
    }void* thread2_func(void* arg)
    {int *var = (int*)arg;// 获取读取锁pthread_rwlock_rdlock(&g_rwlock);printf("thread2 read var is %d\n", *var);// 释放读取锁pthread_rwlock_unlock(&g_rwlock);return NULL;
    }void* thread3_func(void* arg)
    {int *var = (int*)arg;// 获取写入锁pthread_rwlock_wrlock(&g_rwlock);*var = 100;printf("thread3 write var is %d\n", *var);// 释放写入锁pthread_rwlock_unlock(&g_rwlock);return NULL;
    }int main()
    {// 初始化读写锁pthread_rwlock_init(&g_rwlock, NULL);// 创建线程int var = 10;pthread_t th1;pthread_t th2;pthread_t th3;pthread_create(&th1, NULL, thread1_func, &var);pthread_create(&th2, NULL, thread2_func, &var);pthread_create(&th3, NULL, thread3_func, &var);// 等待线程结束pthread_join(th1, NULL);pthread_join(th2, NULL);pthread_join(th3, NULL);// 销毁读写锁pthread_rwlock_destroy(&g_rwlock);return 0;
    }
    

相关文章:

pthread 读写锁使用详解

pthread 读写锁使用 读写锁&#xff1a;提供了一种高效的机制来控制对共享资源的访问。允许多个线程同时读取共享资源&#xff0c;但只允许一个线程独占地写入访问。适用于读取远远超过写入的场景下&#xff0c;因为写入操作需要独占地访问资源&#xff0c;可能会影响读取操作…...

MySQL扩展语句

if not exists xiaobu&#xff1a;xiaobu这个表不存在&#xff0c;才会创建 zerofill&#xff1a;自动填充位置 1 0001 primary key&#xff1a;当前表的主键&#xff0c;主键只能有一个&#xff0c;而且唯一&#xff0c;而且不能为空 auto_increment&#xff1a;表示该字段…...

阿里云号码认证服务(一键登录)在连接wifi的情况下部分机型下存在的问题

手机型号&#xff1a; vivo S16 存在的现象&#xff1a; 安装手机卡(联通卡)&#xff0c;且连接wifi的情况下&#xff0c;APP登录唤起阿里云一键登录服务大概有90%左右必超时(按照阿里云一键登录官方文档设置的超时时间为5秒)。 解决方案&#xff1a; 1、APP端增加超时判断&…...

电脑屏幕监控软件,能够帮助企业完成哪些事情?

电脑屏幕监控软件是一种能够监控和管理员工在电脑上的操作行为的软件。分为两种监控方式&#xff1a;实时监控和屏幕记录监控。实时监控是对电脑屏幕进行实时录像&#xff0c;屏幕记录监控则是以屏幕快照的形式保存下来&#xff0c;供使用者随时查看。电脑屏幕监控软件&#xf…...

java--方法的其他形式

1.方法定义时&#xff1a;需要按照方法解决的实际业务需求&#xff0c;来设计合理的方法形式解决问题。 1.注意事项 ①如果方法不需要返回数据&#xff0c;返回值类型必须申明成void(无返回值申明)&#xff0c;此时方法内部不可以使用return返回数据。 ②方法如果不需要接收数…...

IDEA配置类、方法注释模板

一、打开 IDEA 的 Settings&#xff0c;点击 Editor–>File and Code Templates&#xff0c;点击右边 File 选项卡下面的 Class&#xff0c;在其中添加图中红框内的内容&#xff1a; /** * author li-kun * date ${YEAR}年${MONTH}月${DAY}日 ${TIME} */当你创建一个新的类…...

PowerDesigner 16数据库(mysql)逆向生成pdm

1、配置数据源 2、测试数据源 but~~~~没成功&#xff0c;shift...

Spring Cloud 之Feign

前言 Feign是一个声明式的Web服务客户端&#xff0c;使得编写HTTP客户端变得更简单。在Java程序中&#xff0c;只需要在方法前加上FeignClient注解&#xff0c;Feign就会自动创建一个HTTP客户端&#xff0c;向指定的URL发送请求。 核心概念 1、注解&#xff1a;在服务接口方…...

通用开源自动化测试框架 - Robot Framework

一、什么是 Robot Framework&#xff1f; 1. Robot Framework 的历史由来 Robot Framework是一种通用的自动化测试框架&#xff0c;最早由Pekka Klrck在2005年开发&#xff0c;并由Nokia Networks作为内部工具使用。后来&#xff0c;该项目以开源形式发布&#xff0c;并得到了…...

css position属性与js滚动

“视口”就是浏览器窗口中实际显示文档内容的区域&#xff0c;不包含浏览器的“外框”&#xff0c;如菜单、工具条和标签。文档则是指整个网页。 1 css 的position static 正常定位&#xff0c;是元素position属性的默认值&#xff0c;元素遵循常规流。 relative 相对定位&…...

python内置模块hashlib对于字符串的加密解密加盐

hash是一类算法而hashlib模块是Python的一个内置模块&#xff0c;主要功能是使用对应的hash算法&#xff0c;加密二进制内容解密二进制内容 常见的hash算法有md5、sha1&#xff0c;sha256, sha512等 特点 1.内容敏感,那怕一个很小的字符发生改变都很明显 2.不可逆,不能逆向求值…...

获取客户端请求IP及IP所属城市

添加pom依赖 <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>2.6.5</version> </dependency> public class IpUtil { private…...

【洛谷 P1106】删数问题 题解(贪心+字符串)

删数问题 题目描述 键盘输入一个高精度的正整数 N N N&#xff08;不超过 250 250 250 位&#xff09;&#xff0c;去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N N N 和 k k k&#xff0c;寻找一种方案使得剩下的数字组成…...

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…...

建模和图表工具:Software Ideas Modeler Crack

用于图表、软件设计和分析的 CASE 工具 Software Ideas Modeler 是一款智能CASE 工具和 图表软件&#xff0c;支持 UML、SysML、ERD、BPMN、ArchiMate、流程图、用户故事、线框图。 提升用户体验和人工智能集成 - Software Ideas Modeler 14.05 最近发布的 14.05 版本带来了一…...

Android开发,车载通讯应用——binder通讯原理解析

Binder简单理解 简单来说&#xff0c;Binder 就是用来Client 端和 Server 端通信的。并且 Client 端和 Server 端 可以在一个进程也可以不在同一个进程&#xff0c;Client 可以向 Server 端发起远程调用&#xff0c;也可以向Server传输数据&#xff08;当作函数参数来传&#…...

[算法]求n!在m进制下末尾有多少个0

参考链接&#xff1a;求n&#xff01;在m进制下末尾0的个数_.!零n,,m-CSDN博客 我们这里和参考链接不同 使用结构体去存储每个因数的信息 然后使用变量index作为索引&#xff0c;其最终值为因数的个数 具体原理&#xff1a; 例子1&#xff1a;求9&#xff01;在10进制下的…...

mysql之用户管理、权限管理、密码管理

用户管理 创建用户create user 杨20.0.0.13 identified by 123; 用户重命名rename user 杨20.0.0.13 to yang20.0.0.13; 删除用户drop user 杨20.0.0.13; 权限管理 查看用户权限show grants for 杨20.0.0.13; 赋予用户权限grant all privileges on *.* to 杨localhost id…...

图情档核心期刊 | 北大核心、CSSCI、CSCD

中文核心期刊要目总览&#xff08;A Guide to the Core Journal of China&#xff0c; 简称北大核心&#xff09;&#xff1a; 主办单位&#xff1a;北京大学图书馆更新频率&#xff1a;北大核心在2008年之前每4年更新研究和编制出版一次&#xff0c;2008年之后&#xff0c;改为…...

Mac上具好用的屏幕录像工具(Omi录屏专家)Screen Recorder By Omi Mac 下载安装详细教程

Omi 录屏专家 是 Mac 上的一款出色的录音工具&#xff0c;它让您能够在Mac电脑上轻松录制和保存高质量音频。这款应用拥有简单直观的操作界面&#xff0c;无论我们水平如何&#xff0c;都可以轻松捕捉录制卓越的音质和录像视频。 该版本的 Omi 安装后可以直接支持最高 4K 60帧…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...