Linux多线程:读写锁

2023-10-27

/*


    当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考
    虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想
    读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读
    访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。
    同时多个线程读提高效率
        
        ◼ 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。
            为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现。
        ◼ 读写锁的特点:
            如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作。
            如果有其它线程写数据,则其它线程都不允许读、写操作。
            写是独占的,写的优先级高。

    读写锁的类型 pthread_rwlock_t
    int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
    int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
    

    案例:8个线程操作同一个全局变量。
    3个线程不定时写这个全局变量,5个线程不定时的读这个全局变量
*/

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

// 创建一个共享数据
int num = 1;

// pthread_mutex_t mutex;
pthread_rwlock_t rwlock;

void *writeNum(void * arg) {

    while(1) {
        pthread_rwlock_wrlock(&rwlock);
        num++;
        printf("++write, tid : %ld, num : %d\n", pthread_self(), num);
        pthread_rwlock_unlock(&rwlock);
        usleep(100);
    }

    return NULL;
}

void *readNum(void * arg) {

    while(1) {
        pthread_rwlock_rdlock(&rwlock);
        printf("==read, tid : %ld, num : %d\n", pthread_self(), num);
        pthread_rwlock_unlock(&rwlock);
        usleep(100);
    }

    return NULL;
}

int main() {
    //初始化读写锁
    pthread_rwlock_init(&rwlock, NULL);

    // 创建3个写线程,5个读线程
    pthread_t wtids[3], rtids[5];

    for(int i = 0; i < 3; i++) {
        pthread_create(&wtids[i], NULL, writeNum, NULL);
    }

    for(int i = 0; i < 5; i++) {
        pthread_create(&rtids[i], NULL, readNum, NULL);
    }

    // 设置线程分离
    for(int i = 0; i < 3; i++) {
       pthread_detach(wtids[i]);
    }

    for(int i = 0; i < 5; i++) {
         pthread_detach(rtids[i]);
    }

    pthread_exit(NULL);

    pthread_rwlock_destroy(&rwlock);

    return 0;
}

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

Linux多线程:读写锁 的相关文章

  • 如何在JavaFX中有效地滚动和缩放大图像?

    作为图像处理应用程序的一部分 我需要创建具有缩放 滚动和矢量叠加功能的简单查看器模块 图像相当大 40000x20000 这使得 ImageView 上的操作变慢 缓冲等 在 JavaFX 中处理巨大图像时 改善用户体验的最佳选项是什么 我
  • Java:while循环冻结程序

    我正在制作一个游戏 我需要每 3 秒更新一次 JProgressBar 为此 我使用 while 循环 问题是我的程序由于 while 循环而冻结 我在其他问题中读到它 他们没有帮助我解决这个问题 我不知道如何解决 这是我的代码 publi
  • 解析 (yyyy-MM-dd) 格式的字符串日期

    我有一个 2013 09 18 形式的字符串 我想将其转换为 java util Date 我正在做这个 SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd Date converted
  • 查找所有数组的长度多维数组,Java

    我想使用多维数组来存储数据网格 但是 我还没有找到一种简单的方法来查找长度2nd数组的一部分 例如 boolean array new boolean 3 5 System out println array length 只会输出3 是否
  • Glassfish 4 - JDBC 领域

    Glassfish 4 中的密码加密算法和摘要算法有什么区别 因为Password加密算法不能为空 所以我使用了MD5 Encoding使用了Hex 摘要算法为空 因此默认为 SHA 256 但是 如果我使用 JAAS 制作一个简单的登录应
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • JTree ConvertValueToText 返回在更改时被截断

    我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
  • 类似 jq 中的 sql join

    我有以下 json id 1 type folder title folder 1 id 2 type folder title folder 2 id 3 type item title item 1 folder 1 id 4 type
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • Log4j 2.0 中发现 ClassNotFoundException

    我已经设置了 log4j12 api beta2 jar 的构建路径 但它给出了 以下错误请帮我解决这个问题我的代码如下 java 文件 package com sst log4j class Product private int pro
  • 在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

    有人能够在 SMX4 中的两个或多个捆绑包之间成功共享配置吗 我正在寻找的是这样的 有一个文件 SMX HOME etc myconfiguration cfg 使此配置 可用 以便使用 Spring dm 通过 OSGi 配置管理将其注入
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • Java DNSLookup MX 记录列表。类似于 MXToolBox

    我正在构建一个程序来列出域的所有 MX 记录 起初似乎工作正常 但与在线工具进行比较后http mxtoolbox com http mxtoolbox com 有些域程序无法获取 MX 记录 而 MXToolbox 可以 我不确定原因是什
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList

随机推荐

  • 章节2 开始使用SystemView - Segger SystemView使用手册(译文)

    本文博客链接 http blog csdn net bjr2016 作者 bjr2016 未经允许不得转载 2 开始使用SystemView 这一节描述如何开始使用SEGGER SystemView 解释了如何分析基于监视数据分析一个应用程
  • 共阳和共阴数码管详细段码(带图)

    今天带大家了解数码管的详细段码 数码管主要分共阳数码管和共阴数码管 区别在于其公共端是接电源还是接地 这里我们讲解共阴 共阳 数码管的0 F不带小数点段码和0 F带小数点段码 共阴数码管 1 共阴不带小数点0 F段码为 0x3f 0x06
  • 2022年4月16日-4月22日(ogrePlatformManager源码抄写+ue4视频教程,本周20小时,共1290小时,剩下8710小时。)

    ogre的主题部分ogremain终于抄写完了 good 原以为其他部分不重要 其实并不是 比如 文件系统写到了插件部分 所以还是要抄写 胜利可期 远程办公回来后 感觉心态有些急功近利了 沉不下来了 那先把章节少的ue4视频教程调试部分学下
  • win10系统使用Virtual Box 报错Error reaunching Virtual BoxVM process.5 what: 5 VERR INVALID NAME (-104)

    做101作业的时候 出现这个报错 supR3HardenedWinReSpawn what 5 The virtual machine Windows XP has terminated unexpectedly during startu
  • 史上最简单的SpringCloud教程

    转载请标明出处 原文首发于 https www fangzhipeng com springcloud 2017 07 12 sc09 sleuth 本文出自方志朋的博客 最新Finchley版本请访问 https www fangzhip
  • 【Robot Framework】发送GET和POST请求

    做接口自动化时 经常要使用GET与POST请求 那么如何使用RF发送对应的请求呢 一 安装RequestsLibrary pip install robotframework requests 安装以后 导入到对应的测试套件或测试用例中 本
  • React Native_初识ReactNative

    RN中的View 作为创建UI时最基础的组件 View是一个支持Flexbox布局 样式 一些触摸处理 和一些无障碍功能的容器 并且它可以放到其它的视图里 也可以有任意多个任意类型的子视图 不论在什么平台上 View都会直接对应一个平台的原
  • FTP上传和下载文件

    使用FTP之前最好先在服务器上安装一个serv u软件 用它设置ftp服务表叫方便 实现ftp文件下载 package cn java store test import java io File import java io FileIn
  • Android studio 分析内存泄漏

    http www cnblogs com kelina2mark p 6140658 html
  • Bat脚本自动卸载软件-静默执行

    通过Bat脚本卸载软件 原理是得到某软件的ProductCode 然后通过MsiExec exe命令卸载软件 下面是卸载一个产品的基本代码示例 set ML4 0HF4Name Product4 0HF4 set ML4 0HF4Produ
  • 冒泡排序法

    Hello 大家好 今天我要介绍的是冒泡排序法 冒泡排序法是一种C语言中的数字大小排序的一种方法 这种排序方法是C语言中最简单的一种方法 Now 首先让我们先看一 下冒泡排序法的基本思想 冒泡排序法的思想 两两比较 如果前一个数比后一个数大
  • 程序员的职业成长之路?从初级到高级的技能提升之路

    程序员是一个非常有挑战性和创造性的职业 但也是一个需要不断学习和进步的职业 如果你想在这个行业里有所作为 你需要掌握一些必备的技能和方法 从初级到中级 再到高级 最后达到资深的水平 那么 程序员的成长路线是什么呢 维哥将为你介绍一些实用的建
  • 学计算机电脑屏幕多大,买电脑显示器的技巧 电脑显示屏多大尺寸好

    购买电脑是时 大多数的商家都会把电脑显示器作为电脑配置中的一个主要卖点 但其实很多时候 商家给与我们的信息都是错误的 所以买电脑显示器前 需要自己掌握一些技巧 而一些用户也会在购买多大尺寸的显示屏上纠结着 接下来小编为大家带来买电脑显示器的
  • pytorch之torch.randn()

    torch randn sizes out None dtype None layout torch strided device None requires grad False gt Tensor Args sizes int a se
  • 进入传奇荣耀显示服务器不存在,传奇荣耀复古版

    传奇荣耀复古版 1区服务器爆满排队15分钟 传奇荣耀复古版是一款复古系列的传奇游戏 玩家能够在游戏中24小时匹配到队友进行副本攻略 更有完善的社交系统 让玩家轻松结识更多的兄弟姐妹 实时语音系统方便玩家更好的进行沟通 让玩家们的作战更加轻松
  • 通过Android Timer来实现3S自动页面跳转

    实现开始页面的跳转 就是打开一个Android手机APP的欢迎界面后跳转到指定界面 启动页面的作用能够打广告 发公告 做缓存处理 更新数据等等 Timer是一种定时器工具 用来在一个后台线程计划执行指定任务 它可以计划执行一个任务一次或反复
  • 基于MATLAB的特征值与特征向量(附完整代码)

    目录 一 一般矩阵的特征值与特征向量 例题1 二 广义特征向量问题 例题2 三 稀疏矩阵的最大特征值 例题3 一 一般矩阵的特征值与特征向量 A为n阶矩阵 若数和向量x满足 那么数称为A的特征值 x称为A对应于特征值的特征向量 如果把式子改
  • 文本聚类(二)—— KMeans 聚类

    目录 二 KMeans 聚类 2 1 加载数据集 2 2 数据清洗 2 3 文本向量化 2 4 文本聚类 2 5 关键词展示 2 6 判定最佳聚类数 参考文档 在第一篇内容中 我们介绍了 LDA 主题模型 这一篇 我们将介绍经典的 KMea
  • 大数据分析利器——clickhouse的简介与应用

    大数据分析利器 clickhouse的简介与应用 背景介绍 公司原有的数仓技术架构是基于传统的Hadoop的数仓体系 使用任务调度 通过不同的hive的任 务调度解决不同的业务主题 传统的数仓架构胜在稳定 依托于Hadoop体系 使用的用户
  • Linux多线程:读写锁

    当有一个线程已经持有互斥锁时 互斥锁将所有试图进入临界区的线程都阻塞住 但是考 虑一种情形 当前持有互斥锁的线程只是要读访问共享资源 而同时有其它几个线程也想 读取这个共享资源 但是由于互斥锁的排它性 所有其它线程都无法获取锁 也就无法读