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

线程同步——读写锁

Linux——线程同步 读写锁

目录

一、基本概念

1.1 读写锁的基本概念

1.2 读写锁的优点

1.3 读写锁的实现 

1.4 代码实现


一、基本概念

线程同步中的读写锁(Read-Write Lock),也常被称为共享-独占锁(Shared-Exclusive Lock),是一种用于控制对共享资源的并发访问的同步机制。它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。读写锁的设计目的是在多线程环境中提高并发性能,特别是在读操作远多于写操作的场景中。读写锁与互斥锁区别就是读锁和写锁是分开的

1.1 读写锁的基本概念

读写锁通常由两个锁组成:

  1. 读锁(Shared Lock)允许多个线程同时获取读锁,这意味着多个线程可以同时读取共享资源。当至少有一个线程持有读锁时,其他线程不能获取写锁。

  2. 写锁(Exclusive Lock)只允许一个线程获取写锁,这意味着在任何时刻只有一个线程可以写入共享资源。当线程持有写锁时,其他线程既不能获取读锁也不能获取写锁。

1.2 读写锁的优点

  1. 提高并发性:在读取操作远多于写入操作的情况下,读写锁可以显著提高程序的并发性能,因为它允许多个线程同时读取共享资源。

  2. 避免写饥饿:由于写锁的优先级通常高于读锁,可以避免长时间只进行读操作而使写操作饥饿的情况。

  3. 灵活性:读写锁提供了一种灵活的机制来控制对共享资源的访问,可以根据实际需要选择获取读锁或写锁。

1.3 读写锁的实现 

pthread_rwlock_init 初始化读写锁

pthread_rwlock_rdlock 获取(锁定)一个读写锁以进行读取。

pthread_rwlock_wrlock 获取(锁定)一个读写锁以进行写入。

pthread_rwlock_unlock 释放一个读写锁 解锁

pthread_rwlock_destroy 销毁一个读写锁

1.4 代码实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>

pthread_rwlock_t lock;//定义了一个变量lock

void* fun1(void* arg)//模拟读同时进行和2
{
    for(int i=0;i<20;i++)
    {
        pthread_rwlock_rdlock(&lock);
        printf("fun1 read start:   \n");
        sleep(1);
        printf("fun1 read end:    \n");
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}

void* fun2(void* arg)//读
{
    for(int i=0;i<10;i++)
    {
        pthread_rwlock_rdlock(&lock);
        printf("fun2 read start:   \n");
        sleep(1);
        printf("fun2 read end:    \n");
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}

void* fun3(void* arg)//写 只允许一个进行
{
    for(int i=0;i<8;i++)
    {
        pthread_rwlock_wrlock(&lock);
        sleep(1);
        printf("    fun3 write start:   \n");
        sleep(1);
        printf("    fun3 write end:     \n");
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}
int main()
{
    pthread_rwlock_init(&lock,NULL);

    pthread_t id1,id2,id3;

    pthread_create(&id1,NULL,fun1,NULL);
    pthread_create(&id2,NULL,fun2,NULL);
    pthread_create(&id3,NULL,fun3,NULL);

    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    pthread_join(id3,NULL);

    pthread_rwlock_destroy(&lock);
}

读写锁允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。

  • 这里定义了一个全局的读写锁lock,用于控制对共享资源的访问。

  • 这段代码通过使用读写锁来同步多个线程对共享资源的访问。读线程可以同时访问共享资源,而写线程则需要独占访问。通过这种方式,可以有效地提高程序的并发性能,特别是在读操作远多于写操作的场景中。

相关文章:

  • MYTOOL-记事本
  • C#基础学习(八)终章 C#中的结构体
  • Mockito 全面指南:从单元测试基础到高级模拟技术
  • 前端知识点---window.location.assign() 和 window.location.href 的区别(javascript)
  • deepseek 技术的前生今世:从开源先锋到AGI探索者
  • ETL中数据转换的三种处理方式
  • 蓝耘平台API深度剖析:如何高效实现AI应用联动
  • 周报参考模板
  • IPv6 Dhcpv6 DUID
  • 指标管理+数仓引擎:衡石ChatBI端到端平台的技术架构深度解析
  • 谷歌Android闭源与鸿蒙崛起:一场关于技术主权的生态博弈
  • 第二章VRP介绍///Telnet///DHCP
  • 前端常问的宏观“大”问题详解
  • Anaconda开始菜单里添加JupyterLab快捷方式
  • 基于javaweb的SSM航班机票预订平台系统设计与实现(源码+文档+部署讲解)
  • 【大模型】GRPO:从 PPO 到群体相对策略优化的进化之路
  • javaWeb Router
  • Promise怎么使用,以及它解决了什么问题?
  • 【Pandas】pandas Series to_sql
  • Sa-Token
  • 做医学网站/搜索引擎优化方法与技巧
  • 汉阴做网站/国外域名注册网站
  • 请人做网站 出现纠纷怎么办/百度seo关键词排名查询
  • 有微重庆网站吗/搜索引擎的网站
  • 新买的服务器怎么做网站/seo基础培训机构
  • 中石化第四建设有限公司网站/天津网站优化公司