news 2026/4/15 9:50:46

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
读写锁进阶: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){
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 22:04:33

cookie池的搭建与维护-2

[Cookie实战]一键部署大批量的Cookie调试环境 Cookie池项目介绍 web项目&#xff0c;统一管理账号密码&#xff0c;以及维护Cookie 【定时】全自动根据账号密码登录并提取Cookie 【被动】协助式绕过验证码实现登录并获取Cookie 主动提供接口API&#xff0c;实现Cookie的使用 …

作者头像 李华
网站建设 2026/4/14 20:04:29

自学嵌入式day31,waitpid,system 函数

waitpid 和 wait 函数waitpid(-1, status, 0) 等同于 wait(status)。 waitpid 函数原型为 pid_t waitpid(pid_t pid, int *status, int options)。参数说明&#xff1a;pid 取值决定回收的子进程范围&#xff1a;<-1&#xff1a;回收指定进程组内的任意子进程。-1&#xff1…

作者头像 李华
网站建设 2026/4/1 22:12:19

泛型继承实战指南(高级程序员必知的3个隐秘特性)

第一章&#xff1a;泛型的继承在面向对象编程中&#xff0c;继承是构建可复用、可扩展代码结构的核心机制。当泛型与继承结合使用时&#xff0c;能够实现更加灵活和类型安全的类层次结构。泛型类可以像普通类一样被继承&#xff0c;子类可以固定父类中的类型参数&#xff0c;也…

作者头像 李华
网站建设 2026/4/14 7:02:42

Symfony 8路由系统重构:从延迟2秒到毫秒级响应的优化之路

第一章&#xff1a;Symfony 8路由系统重构&#xff1a;从延迟2秒到毫秒级响应的优化之路在 Symfony 8 的新版本中&#xff0c;路由系统经历了一次深度重构&#xff0c;显著提升了请求解析性能。以往在复杂路由配置下可能出现接近 2 秒的响应延迟&#xff0c;如今已优化至毫秒级…

作者头像 李华
网站建设 2026/4/13 18:27:05

GraphQL + PHP缓存优化:99%开发者忽略的6个关键实践

第一章&#xff1a;GraphQL PHP缓存优化的核心挑战在构建高性能的现代Web应用时&#xff0c;GraphQL与PHP的结合为开发者提供了灵活的数据查询能力&#xff0c;但同时也带来了显著的缓存优化难题。由于GraphQL允许客户端按需请求字段&#xff0c;传统的基于完整页面或接口响应…

作者头像 李华
网站建设 2026/4/3 6:46:07

5、Linux 文件压缩、归档与文本文件管理全解析

Linux 文件压缩、归档与文本文件管理全解析 1. Linux 中的文件压缩 在 Linux 系统里,文件压缩是一项常见且重要的操作,它能有效节省磁盘空间。下面为你介绍几种常用的压缩工具及其使用方法。 1.1 xz 压缩 xz 是 Linux 中空间利用率最高的压缩工具,不过它的压缩速度相对较…

作者头像 李华