Linux之线程-读写锁pthread_rwlock_t

2023-11-13

**主要内容:
(1)互斥量及如何使用
(2)什么是死锁,如何解决
(3)什么是读写锁,如何使用**
(4)条件变量实现的生产消费者模型
(5)信号量实现的生产消费者模型

3.读写锁

特点:读共享,写独占,写优先级高。读写锁仍然是一把锁,有不同的状态:未加锁、读锁和写锁。

场景:适合读的线程较多的情况

  1. 线程A加写锁成功,线程B请求读锁。--线程B阻塞
  2. 线程A持有读锁,线程B请求写锁。--线程B阻塞
  3. 线程A持有读锁,线程B请求读锁。--B加锁成功
  4. 线程A持有读锁,然后线程B请求读锁,然后线程C请求写锁。--BC阻塞--A释放,C加锁--C释放B加锁
  5. 线程A持有写锁,然后线程B请求读锁,然后线程C请求写锁。--BC阻塞--A释放,C加锁--C释放B加锁

函数原型:#include <pthread.h>

(1)读写锁初始化

  • int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);
  • pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

(2)摧毁读写锁

  • int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

(3)加读锁

  • int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);  //成功返回0,错误返回an error number shall be returned to indicate the error.

  •  int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);  //同上

(4)加写锁

  • int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

(5)释放锁

  • int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

示例:

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

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;  //读写锁初始化
int beginnum = 1000;

void *thr_write(void *arg)
{
    while (1)
    {
        pthread_rwlock_wrlock(&rwlock);
        printf("------%s-----self----%lu---beginnum----%d\n",__FUNCTION__,pthread_self(),++beginnum);
        usleep(2000); //模拟占用时间
        pthread_rwlock_unlock(&rwlock);
        usleep(4000);
    }
    
    return NULL;
}

void *thr_read(void *arg)
{
    while (1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("------%s-----self----%lu---beginnum----%d\n",__FUNCTION__,pthread_self(),beginnum);
        usleep(2000); //模拟占用时间
        pthread_rwlock_unlock(&rwlock);
        usleep(2000);
    }

    return NULL;

}

int main()
{
    int n =8, i = 0;
    pthread_t tid[8];  //5-read, 3-write
    for(i = 0; i < 5; i++)
    {
        pthread_create(&tid[i],NULL,thr_read,NULL);
    }

    for(i = 0; i < 3; i++)
    {
        pthread_create(&tid[i],NULL,thr_write,NULL);
    }

    for(i=0; i < 8; i++)
    {
        pthread_join(tid[i],NULL);
    }
    return 0;
}

输出:

~$ gcc rwlock.c -lpthread
~$ ./a.out
------thr_read-----self----140403159697152---beginnum----1000
------thr_read-----self----140403151304448---beginnum----1000
------thr_read-----self----140403126126336---beginnum----1000
------thr_read-----self----140403134519040---beginnum----1000
------thr_read-----self----140403142911744---beginnum----1000
------thr_write-----self----140403117733632---beginnum----1001
------thr_write-----self----140403109340928---beginnum----1002
------thr_write-----self----140403100948224---beginnum----1003
------thr_write-----self----140403117733632---beginnum----1004
------thr_write-----self----140403109340928---beginnum----1005
------thr_write-----self----140403100948224---beginnum----1006
------thr_write-----self----140403117733632---beginnum----1007
------thr_write-----self----140403109340928---beginnum----1008
------thr_write-----self----140403100948224---beginnum----1009
------thr_write-----self----140403117733632---beginnum----1010
------thr_write-----self----140403109340928---beginnum----1011
------thr_write-----self----140403100948224---beginnum----1012
------thr_write-----self----140403117733632---beginnum----1013

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux之线程-读写锁pthread_rwlock_t 的相关文章

  • [leetcode] 2024. 考试的最大困扰度

    题目链接 题意 给出只含有两种字符的字符串以及一个次数限制k 问最多修改k个位置 T gt F F gt T 最大的连续的字符串的长度是多少 思路 双指针 滑动窗口 假如说我们要找修改后连续的T最长的长度 我们可以 枚举右端点 并统计当前不
  • 【深度学习】关于EMA:指数移动平均

    什么是EMA 指数移动平均 exponential moving average 也叫做权重移动平均 weighted moving average 可以用来估计变量的局部均值 使得变量的更新与一段时间内的历史取值有关 在采用 SGD 或者
  • Oracle11g补丁安装(单实例)

    Oracle11g补丁安装 单实例 一 安装环境及补丁版本 Oracle版本 11 2 0 4 Linux版本 Red Hat Enterprise Linux Server release 6 4 Santiago PSU版本号 p317
  • Git 安装和环境部署

    1 下载Git 进入Git的GitHub项目release下载 进入国内镜像源下载 镜像地址 2 安装Git 跟随安装引导进行安装 选择各项 如没有特殊需求 大多数选项一直next即可 3 设置name和email
  • Docker login 命令-Docker login 作用-Docker login 默认用户名和密码-Docker登录-嗨客网

    docker login命令教程 docker login 命令用于登陆到一个 Docker 镜像仓库 如果未指定镜像仓库地址 默认为官方仓库 Docker Hub 如果用户使用 docker login 命令登录官方仓库 首先我们需要在官
  • 服务器管理系统是什么

    服务器管理系统是什么 服务器管理系统 是在操作系统下对操作系统的服务器软件及其相关软件进行二次设置的管理软件 是运营商管理域名 服务器 企业邮局 数据库等服务器主机类产品的一个网站平台 以达到快捷实现域名 服务器主机 企业邮局 数据库等产品
  • protobuf在C#项目中的使用

    protobuf在C 项目中的使用 在C 项目中 有时候会使用到使用到protobuf来作为通信时数据交换的格式 protobuf ProtocolBuffer 简称PB 是google 的一种数据交换的格式 这是一种二进制的格式 比使用x

随机推荐

  • SqlServer视图介绍以及创建方式

    1 视图的介绍 ps 学sqlServer视图是在面试问到之后学的 答不上来太low了 然后就去各种搜索操作对视图也有了自己的理解 其实视图就是一张表 是一张表中或者多张表中经过某种筛选后显示的数据 视图是 由一个预定义的查询select语
  • JAVA 经常遇到一些问题【第二部分36~51】

    重拾者 每日记录至目前 记录51种不同场景的问题可参考解决方案 异常就两部分 1 excepiton信息 报错产生的原因 2 at开头表示 异常产生的代码位置 欢迎关注微信公众号 AIMING2020 拆分两篇博客 第一部分1 35 地址如
  • 【开源】DA14580-GPIO实验教程——疯壳·ARM双处理器开发板系列

    目录 第一节 LED硬件电路 第二节 GPIO寄存器 2 1 GPIO引脚介绍 2 2寄存器介绍 2 2 1 P0数据寄存器 2 2 2 P0设置数据寄存器 2 2 3 P0复位数据寄存器 2 2 4 P00模式寄存器 2 2 5 P1 P
  • “拖延症”的良方——对于追求完美,自制力差,情绪化的人很受用。

    上大学以后 我开始有了拖延的毛病 立下目标无数 但时常却动力奇缺 常常在网上浏览着各色的小说和帖子 或是玩很无聊的弱智在线小游戏 却不愿碰专业书本或文献一下 甚至哪怕deadline就在几天之后 只有在deadline之前一点点时间才会因紧
  • 关系型数据库与非关系型数据库的区别

    当前主流的关系型数据库有Oracle DB2 Microsoft SQL Server Microsoft Access MySQL等 非关系型数据库有 NoSql Cloudant nosql和关系型数据库比较 优点 1 成本 nosql
  • Improved Denoising Diffusion Probabilistic Models 论文阅读

    前言 DDPM模型虽然在生成任务上达到了不错的效果 但是也同样存在一些问题 例如采样时间过长 对数似然不高等 对数似然是生成模型中广泛使用的指标 优化对数似然迫使生成模型学习各个数据分布 使得模型的多样性大大提高 此外 对数似然性的微小改进
  • element Drawer 抽屉无法渲染

    出现的问题 不使用脚手架和node js时drawer不渲染 原因 没有引入最新的样式 解决方案 cdn引入
  • 性能测试(Jemeter)

    1 性能指标 响应时间 一次请求的往返时间 tps 每秒系统能够处理的事务数 比如订单中的下单操作 下单后续有很多操作 比如创建订单 扣除库存 清算库存等 这个完整操作就是一个完整的事务 qps 每秒系统能处理的查询数 就是每秒系统能够承受
  • 数据库技术的发展历史是怎么样的?

    数据库技术产生于20世纪60年代末70年代初 其主要主要研究如何存储 使用和管理数据 随着计算机硬件和软件的发展 数据库技术也不断地发展 数据库技术在理论研究和系统开发上都取得了辉煌的成就 从数据管理的角度看 数据库技术到目前共经历了如下三
  • 前端拿到后台接口返回的数据,并根据实际情况按需处理数据

    方法一 通过数据数组的map方法 创建一个假数据 用于模拟后台返回的多级数据 let options id 1 name 水果 children id 11 name 榴莲 prices 55 id 12 name 苹果 prices 45
  • AD常用快捷键总结

    1 shift s 键 切换单层显示 2 q Ctrl Q 英寸和毫米 尺寸切换 3 D R进入布线规则设置 其中 Clearance 是设置最小安全线间距 覆铜时候间距的 比较常用 4 CTRL 鼠标单击某个线 整个线的NET 网络 呈现
  • C盘如何扩容

    一 使用Windows自带的磁盘管理 1 1 清空D盘 单击D 然后选择 删除卷 然后D盘显示 未分配 1 2 C盘右键 选择 拓展卷 1 3 选择 未分配的 D盘 1 4 完成 可以看到C盘已经是合并后的大小了
  • linux学习:chmod

    Linux权限 1 Linux常见权限 444 dr r r 666 lrw r r 666 rw rw rw 700 drwx 744 drwxr r 755 drwxr xr x 777 drwxrwxrwx 我们从左到右看 第一二三位
  • ConfigurationSettings.AppSettings已过时的解决办法

    开始使用VS 2005 习惯性的使用ConfigurationSettings类来读取应用程序配置文件的信息时 却被编译器提示说 警告 1 System Configuration ConfigurationSettings AppSett
  • Anaconda中创建新的Python虚拟环境并安装Tensorflow框架

    一 问题 在安装Anaconda后 默认的Python版本是3 8 3 由于深度学习框架tensorflow的不同版本匹配的Python版本也不同 所以需要创建一个新的Python虚拟环境3 7版本 二 如何创建 打开Anaconda Pr
  • vue3 使用 vite 构建的项目打包后无法访问

    解决办法 1 安装 vitejs plugin legacy D npm i vitejs plugin legacy D 2 vite config js 添加配置 import legacy from vitejs plugin leg
  • springboot中对redis的操作封装工具类

    我们可以自己写一个工具类把redisTemplate进行封装 方便我们调用 这是一种很好的开发方式 简化开发 狂神教程中的封装 package com kuang utils import org springframework beans
  • HTML表单(属性/元素/输入类型/输入属性):看这一篇就够了

    HTML表单 HTML 表单用于搜集不同类型的用户输入
  • 使用Python绘画象棋棋盘(turtle)

    通过使用turtle绘画象棋棋盘 绘制象棋棋盘 import turtle t turtle Pen t width 2 设置画笔粗细 t speed 1 设置画笔移动速度 画竖线 t penup t goto 400 400 for i
  • Linux之线程-读写锁pthread_rwlock_t

    主要内容 1 互斥量及如何使用 2 什么是死锁 如何解决 3 什么是读写锁 如何使用 4 条件变量实现的生产消费者模型 5 信号量实现的生产消费者模型 3 读写锁 特点 读共享 写独占 写优先级高 读写锁仍然是一把锁 有不同的状态 未加锁