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

读写锁进阶:3写5读并发计数器实战与核心概念解析

各类资料学习下载合集
链接:https://pan.quark.cn/s/770d9387db5f

在上一篇文章中,我们初步认识了读写锁(Read-Write Lock)“写独占,读共享”的特性,并了解了它在“读多写少”场景中的巨大优势。今天,我们将通过一个更具体的案例——3个写线程和5个读线程并发访问一个计数器——来进一步巩固读写锁的使用,并深入理解其背后的三大核心概念。


一、 核心概念重温:读写锁的三句话

读写锁之所以高效且强大,源于其独特的工作机制。我们可以用三句话来概括:

  1. 单一锁体,双重模式:整个系统中只有一把读写锁,但它有两种工作状态:读模式写模式
  2. 访问规则:读共享,写独占
    • 读共享:多个读线程可以同时获得读锁,并发地读取共享数据。
    • 写独占:任何一个写线程获取写锁时,都将独占资源,无论是其他读线程还是写线程,都必须等待。
  3. 优先级机制:写优先:当有写锁请求等待时,新的读锁请求也会被阻塞,排在写锁之后,以确保写者不会长时间“饿死”。但需要注意的是,写锁不会中断已经获得的读锁。

实际运行表现

  • 数据一致性:在写操作完成后,所有读线程读取到的值都是最新的、一致的。
  • 原子性:写操作之间不会交叉执行,保证了数据修改的原子性。

二、 读写锁的“工具箱”:常用操作函数

熟练掌握读写锁的 API 是正确使用的前提。

函数原型描述
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);初始化读写锁。rwlock指向读写锁对象,attr通常传NULL使用默认属性。restrict关键字用于编译器优化,表示该指针是访问其指向内存的唯一途径。
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);销毁读写锁,释放其占用的资源。
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);阻塞式获取读锁。如果当前有写锁被持有,调用线程会阻塞,直到获取到读锁。
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);阻塞式获取写锁。如果当前有任何读锁或写锁被持有,调用线程会阻塞,直到获取到写锁。
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);非阻塞式尝试获取读锁。如果锁不可用,立即返回EBUSY错误而不是阻塞。
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);非阻塞式尝试获取写锁。如果锁不可用,立即返回EBUSY错误而不是阻塞。
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);释放读写锁。该函数是通用的,不区分之前是读锁还是写锁。

三、 实战演练:3写5读的并发计数器 (rwlock_example_final.c)

我们将创建一个全局计数器counter,并启动 3 个写线程对其进行++操作,以及 5 个读线程来读取counter的值。

1. 代码示例

#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<stdlib.h>// For EXIT_FAILURE// 共享资源和读写锁intcounter=0;pthread_rwlock_trwlock;// 读线程函数void*th_read(void*arg){
http://www.cnnetsun.cn/news/67963.html

相关文章:

  • 为什么Laravel 13的多模态存储设计让90%的开发者拍案叫绝?
  • 【计算机毕设选题】基于Spark的公务员招录职位信息可视化分析系统源码,Python大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习
  • 如何利用微信个人号API接口进行二次开发?
  • Symfony 8服务注册中心性能优化指南(提升响应速度300%)
  • 3、CentOS 7 入门:Bash shell 与文件系统导航
  • 2025年低成本提升AI能力:CAIE认证的高性价比之选
  • 2025应届生AI证书避坑指南:CAIE认证成优选
  • 如何利用PHP 8.6的JIT指令优化实现毫秒级响应?
  • 【Symfony 8路由安全进阶指南】:掌握参数验证的5大核心技巧
  • 从传感器到图表:PHP实现农业数据实时可视化的5个关键步骤
  • 业务导向型技术日志首日记录(业务中使用的技术栈)
  • 基于SpringBoot + Vue的宠物殡葬网站设计
  • 基于Uniapp + SpringBoot + Vue的中医个性化养生系统的设计与实现
  • 亲测有效:打印机驱动程序无法使用的完整解决思路
  • ollama pull qwen:32b命令执行失败原因排查
  • 基于Uniapp + SpringBoot + Vue的高校就业招聘系统的设计与实现
  • Qwen3-32B适合哪些行业?金融、医疗、法律应用场景解析
  • 创业团队用 XinServer 提升项目交付效率实战
  • 交换机上各种接口
  • Google Vids:由AI驱动的工作视频创作 | ProductHunt 今日热榜 - 12月15日
  • 情感智能对话系统AI Agent:LLM驱动的深度交互
  • HDFS在大数据分析中的数据访问与处理优化
  • 自动驾驶—CARLA仿真(8)tutorial demo
  • 从被动响应到主动赋能:家具行业客服机器人的革新路径
  • AI辅助可再生能源发电预测:从气象数据到电力市场
  • 细节定成败!鹧鸪云让储能配置精准落地
  • 基于Qwen3-8B构建智能对话系统:从ollama下载到部署
  • 模块化公链的2025:动态分片、AI审计与量子安全的成本革命
  • 从Transformer模型详解到Seed-Coder-8B-Base的应用落地
  • 8、Qt 编程中的文件、流与 XML 处理