Linux IPC:读写锁汇总整理

news/2024/12/22 20:38:46 标签: linux, c语言, 开发语言, 读写锁, IPC, 并发, 同步

读写锁(Readers-Writers Locks)是一种同步机制,用于允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁的设计目的是为了提高并发性能,尤其是在读操作远比写操作频繁的情况下。下面详细介绍读写锁的概念、用途、API以及示例代码。

a9729d6d7e9e4f63b1622c53d1772f69.jpeg

概述

读写锁的特点如下:

  • 读共享:允许多个线程同时进行读操作。
  • 写独占:一次只能有一个线程进行写操作,且在此期间不允许任何读操作。
  • 写优先:在某些实现中,如果有线程正在等待写锁,那么即使有多个线程持有读锁,也会让等待的写锁线程优先获得锁。
  • 公平性:某些实现会考虑锁请求的先后顺序,以确保公平性。

API

读写锁的主要 API 如下:

  • pthread_rwlock_init():

    • int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr): 初始化读写锁
    • 参数rwlock是指向读写锁变量的指针,attr是属性指针,可以为NULL
  • pthread_rwlock_rdlock():

    • int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock): 获取读锁。
    • 参数rwlock是指向读写锁变量的指针。
  • pthread_rwlock_wrlock():

    • int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock): 获取写锁。
    • 参数rwlock是指向读写锁变量的指针。
  • pthread_rwlock_tryrdlock():

    • int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock): 尝试获取读锁,如果锁已经被占用则立即返回。
    • 参数rwlock是指向读写锁变量的指针。
  • pthread_rwlock_trywrlock():

    • int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock): 尝试获取写锁,如果锁已经被占用则立即返回。
    • 参数rwlock是指向读写锁变量的指针。
  • pthread_rwlock_unlock():

    • int pthread_rwlock_unlock(pthread_rwlock_t *rwlock): 释放读写锁
    • 参数rwlock是指向读写锁变量的指针。
  • pthread_rwlock_destroy():

    • int pthread_rwlock_destroy(pthread_rwlock_t *rwlock): 销毁读写锁
    • 参数rwlock是指向读写锁变量的指针。

示例代码

下面是一个简单的示例,展示了如何使用读写锁同步多个线程的操作:

1#include <pthread.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <unistd.h>
5
6// 定义读写锁
7pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
8int data = 0;
9
10// 读取线程
11void *reader(void *arg) {
12    while (1) {
13        pthread_rwlock_rdlock(&rwlock);  // 获取读锁
14
15        printf("Reader: data=%d\n", data);
16
17        pthread_rwlock_unlock(&rwlock);  // 释放读锁
18
19        sleep(1);  // 休眠一秒
20    }
21}
22
23// 写入线程
24void *writer(void *arg) {
25    while (1) {
26        pthread_rwlock_wrlock(&rwlock);  // 获取写锁
27
28        data++;  // 修改数据
29        printf("Writer: updated data to %d\n", data);
30
31        pthread_rwlock_unlock(&rwlock);  // 释放写锁
32
33        sleep(1);  // 休眠一秒
34    }
35}
36
37int main() {
38    pthread_t reader_tid, writer_tid;
39
40    // 创建读取线程
41    if (pthread_create(&reader_tid, NULL, reader, NULL) != 0) {
42        perror("pthread_create");
43        exit(EXIT_FAILURE);
44    }
45
46    // 创建写入线程
47    if (pthread_create(&writer_tid, NULL, writer, NULL) != 0) {
48        perror("pthread_create");
49        exit(EXIT_FAILURE);
50    }
51
52    // 等待线程结束
53    pthread_join(reader_tid, NULL);
54    pthread_join(writer_tid, NULL);
55
56    return 0;
57}

注意事项

  • 初始化和销毁:确保在使用读写锁之前正确初始化它,并在不再需要时销毁它。
  • 锁的获取和释放:在获取锁后,确保在适当的时候释放锁,以避免死锁或资源泄漏。
  • 尝试获取锁:使用pthread_rwlock_tryrdlock()pthread_rwlock_trywrlock()可以避免无限期等待,从而增加程序的健壮性。
  • 线程取消:在使用读写锁时,确保处理线程取消的情况,避免资源泄漏。

读写锁在多线程编程中非常有用,特别是在读操作远比写操作频繁的场景中。理解和熟练掌握这些概念对于编写高效、可靠的多线程应用程序至关重要。

 


http://www.niftyadmin.cn/n/5795826.html

相关文章

k8s迁移——岁月云实战笔记

新系统使用rockylinux9.5&#xff0c;旧系统虚拟机装的是centos7 1 目标服务器 1.1 禁止swap swapoff -a vi /etc/fstab #/dev/mapper/rl-swap none swap defaults 0 0 #执行&#xff0c;swap一行都是0 free -h 1.2 关闭防火墙 只是为了减…

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件.

【单片机】IIC需要注意什么(企业级回答)

问&#xff1a;IIC需要注意的有哪些 初步测试实现阶段&#xff1a; 1、从应用层来看&#xff0c;先看数据手册确定下手册中的从机地址指的是八位地址还是七位地址。 2、确定下要对应操作的读写的寄存器 3、直接在原有的demo上尝试运行&#xff0c;看看能不能通讯成功&#xff0…

Powershell(1)

1.Powershell认识&版本信息输出 powershell自身很强大&#xff0c;cmd能做到powershell都能做&#xff0c;cmd可以写一些简单的脚本程序&#xff0c;但是实现起来并不容易&#xff0c;它的功能和可拓展性并不是很好。但是linux shell写起来就会方便很多&#xff0c;在目前…

CIC滤波器算法详解与Python实现

目录 CIC滤波器算法详解与Python实现第一部分&#xff1a;CIC滤波器概述1.1 什么是CIC滤波器&#xff1f;1.2 CIC滤波器的应用1.3 CIC滤波器的优势1.4 CIC滤波器的缺点 第二部分&#xff1a;CIC滤波器的原理与工作机制2.1 CIC滤波器的结构2.2 CIC滤波器的工作流程2.3 CIC滤波器…

OceanBase 数据库分布式与集中式 能力

OceanBase分布式数据库与集中式数据库的差异 分布式数据库能解决金融行业最有挑战的高并发低延迟的核心交易系统的稳定性、扩展性、高性能问题。OB之所以一直强调分布式是说它具备很强的数据处理能力&#xff0c;当然从OB4.0开始也支持集中式了。 在实际业务场景中20%是分布式…

CSS 网络安全字体

适用于 HTML 和 CSS 的最佳 Web 安全字体 下面列出了适用于 HTM L和 CSS 的最佳 Web 安全字体&#xff1a; Arial (sans-serif)Verdana (sans-serif)Helvetica (sans-serif)Tahoma (sans-serif)Trebuchet MS (sans-serif)Times New Roman (serif)Georgia (serif)Garamond (se…

均方误差损失函数(MSE)和交叉熵损失函数详解

为什么需要损失函数 前面的文章我们已经从模型角度介绍了损失函数&#xff0c;对于神经网络的训练&#xff0c;首先根据特征输入和初始的参数&#xff0c;前向传播计算出预测结果&#xff0c;然后与真实结果进行比较&#xff0c;得到它们之间的差值。 损失函数又可称为代价函…