读写锁三种关系的证明(读者和读者互补影响、写者和写者互斥、读者和写者互斥)

news2024/11/16 2:37:34

        目录

1、读者和读者互不影响

2、写者和写者互斥

3、读者和写者互斥

(1) 读者持有锁

(2) 写者持有锁


1、读者和读者互不影响

假设现在只有读者线程,我们让一个读者线程申请锁以后,但是不释放读写锁。

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

pthread_rwlock_t rwlock;
void* read_thread(void* args){
	 pthread_detach(pthread_self());
     int num = *(int*)args;
 	 while (1)
 	 {
		 pthread_rwlock_rdlock(&rwlock);        // 申请读者锁
		 printf("读者[%d]正在读内容\n", num);
 		 sleep(1);
		 //pthread_rwlock_unlock(&rwlock);      
 	 }
}

int main(){
	pthread_t tid1,tid2,tid3,tid4;
	pthread_rwlock_init(&rwlock, NULL);
	int i = 1, j = 2;
	pthread_create(&tid1,NULL,read_thread, (void*)&i);
	pthread_create(&tid2,NULL,read_thread,(void*)&j);
	while(1){    
		sleep(1);
	} 
	return 0;
}

我们发现,读者和读者之间不会去争抢锁,即便是某一个读者线程申请到锁,也不会影响其他读者线程来申请锁。

 

2、写者和写者互斥

我们采用和上面类似的做法,只有两个写者线程,其中一个写者线程获取到锁以后,不释放锁,看一下另一个写者线程能否得到锁。

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

pthread_rwlock_t rwlock;
void* write_thread(void* args){
	pthread_detach(pthread_self());
	int num = *(int*)args;
	while (1)
	{
		pthread_rwlock_wrlock(&rwlock);
		printf("写者[%d]正在写内容\n", num);
		//pthread_rwlock_unlock(&rwlock);
        sleep(1);
	}
}

int main(){
	pthread_t tid1,tid2,tid3,tid4;
	pthread_rwlock_init(&rwlock, NULL);
	int i = 1, j = 2;
	pthread_create(&tid3,NULL,write_thread,(void*)&i);
    pthread_create(&tid4,NULL,write_thread,(void*)&j);
	while(1){    
		sleep(1);
	} 
	return 0;
}

我们发现始终只有写者2在打印,说明写者2拿到锁以后,写者1就无法获取到锁了。说明写者和写者之间是互斥的。

 

3、读者和写者互斥

这里就分为两种场景:读者持有锁、写者持有锁。

  • 读者持有锁时,写者申请锁会阻塞等待,但是读者申请锁不受影响。
  • 写者持有锁时,无论是读锁申请还是写锁申请,都会被阻塞

(1) 读者持有锁

现在有三个线程,两个读线程,一个写线程,他们执行的操作如下:

  • 读者[1]:立马申请锁,但是不释放
  • 写者[1]:延迟1s以后申请(验证写者申请锁是否会被阻塞)
  • 读者[2]:延迟2s后申请(验证写者之后的读锁申请是否会被阻塞)
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_rwlock_t rwlock;
void* read_thread1(void* args){
	 pthread_detach(pthread_self());

	 printf("读者[1]申请锁\n");
 	 while (1)
 	 {
		 pthread_rwlock_rdlock(&rwlock);
		 printf("读者[1]正在读内容\n");
 		 sleep(1);
		 // pthread_rwlock_unlock(&rwlock);        // 读者1不释放锁
 	 }    
}
void* read_thread2(void* args){
	 pthread_detach(pthread_self());
     //int num = *(int*)args;
	
	 sleep(2);    // 让读者[2]延迟2s再申请
	 printf("读者[2]申请锁\n");
 	 while (1)
 	 {
		 pthread_rwlock_rdlock(&rwlock);
		 printf("读者[2]正在读内容\n");
		 pthread_rwlock_unlock(&rwlock);
		 sleep(1);
 	 }
}

void* write_thread(void* args){
	pthread_detach(pthread_self());
	
	sleep(1);                // 让写者[1]延迟1s再申请
	printf("写者1申请锁\n");
	while (1)
	{
		pthread_rwlock_wrlock(&rwlock);
		printf("写者[1]正在写内容\n");
		pthread_rwlock_unlock(&rwlock);
        sleep(1);
	}
}

int main(){
	pthread_t tid1,tid2,tid3,tid4;
	pthread_rwlock_init(&rwlock, NULL);
	int i = 1, j = 2;
	pthread_create(&tid1,NULL,read_thread1, NULL);
	pthread_create(&tid2,NULL,read_thread2, NULL);
	pthread_create(&tid3,NULL,write_thread, NULL);
	while(1){    
		sleep(1);
	} 
	return 0;
}

(2) 写者持有锁

我们采用和上面类似的步骤,

  • 写者[1]:先申请锁,但不释放
  • 其他读者:延迟1s后申请
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_rwlock_t rwlock;
void* read_thread1(void* args){
	 pthread_detach(pthread_self());

     sleep(1);                // 让读者[1]延迟1s再申请
	 printf("读者[1]申请锁\n");
 	 while (1)
 	 {
		 pthread_rwlock_rdlock(&rwlock);
		 printf("读者[1]正在读内容\n");
		 pthread_rwlock_unlock(&rwlock);
         sleep(1);
 	 }
}
void* read_thread2(void* args){
	 pthread_detach(pthread_self());
     //int num = *(int*)args;
	
	 sleep(1);                // 让读者[2]延迟1s再申请
	 printf("读者[2]申请锁\n");
 	 while (1)
 	 {
		 pthread_rwlock_rdlock(&rwlock);
		 printf("读者[2]正在读内容\n");
		 pthread_rwlock_unlock(&rwlock);
		 sleep(1);
 	 }
}

void* write_thread(void* args){
	pthread_detach(pthread_self());
	
	printf("写者1申请锁\n");
	while (1)
	{
		pthread_rwlock_wrlock(&rwlock);
		printf("写者[1]正在读内容\n");
		// pthread_rwlock_unlock(&rwlock);   // 写者1不释放锁
        sleep(1);
	}
}

int main(){
	pthread_t tid1,tid2,tid3,tid4;
	pthread_rwlock_init(&rwlock, NULL);
	int i = 1, j = 2;
	pthread_create(&tid1,NULL,read_thread1, NULL);
	pthread_create(&tid2,NULL,read_thread2, NULL);
	pthread_create(&tid3,NULL,write_thread, NULL);
	while(1){    
		sleep(1);
	} 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]JAVA毕业设计计算机专业在线学习评估软件-演示录像-(系统+LW)

[附源码]JAVA毕业设计计算机专业在线学习评估软件-演示录像-&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

HTML小游戏15 —— 网页版3D反恐英雄(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计…

[附源码]Python计算机毕业设计Django教学辅助系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2022年各大企业java面试题解析,堪称全网最详细的java面试指南

前言 最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对Java的人才要求越来越高了。 ​基本上这样感慨的分为两类人&#xff0c;第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&am…

膜拜,终于拿到了美团大佬分享的Netty源码剖析与应用PDF

前言 时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Ja…

机器学习笔记之受限玻尔兹曼机(二)模型表示

机器学习笔记之受限玻尔兹曼机——模型表示引言回顾&#xff1a;玻尔兹曼分布玻尔兹曼机关于玻尔兹曼机的问题受限玻尔兹曼机受限玻尔兹曼机的学习任务(填坑)引言 上一节基于马尔可夫随机场介绍了玻尔兹曼分布&#xff0c;本节将介绍受限玻尔兹曼机的模型表示(Representation)…

阿里资深专家分享程序员三门课:技术精进架构修炼、管理探秘文档

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生…

将0-255的色彩映射表导出为RGB波段

当我们拿到0-255的色彩映射表栅格文件的时候&#xff0c;可能不太好用&#xff0c;需要导出为RGB波段或者其他波段形式的&#xff0c;在Global Mapper中可以做到。 打开0-255色彩映射表的栅格文件&#xff0c;在Arcmap中可以看到是这样的&#xff1a; 1 在ArcMap中操作步骤…

PE文件硬编码代码注入

以下适合有PE基础的人看&#xff0c;最起码要知道PE的基本结构和rva以及foa之间如何相互转换&#xff0c;不然会看的迷迷糊糊 先决条件 首先我们需要准备一个程序&#xff0c;待会将代码注入这个程序中 随便编写一个简单的程序&#xff0c;将随机基址给关闭 硬编码 程序编…

PyQt5基础练习2

实验4 关闭窗口 4.1 完整代码 #!/usr/bin/python3 # -*- coding: utf-8 -*-""" ZetCode PyQt5 tutorialThis example shows a tooltip on a window and a button.Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """import…

推荐系统在腾讯游戏运营中的实践

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点2021-2022元宇宙报告.pdf清华大学256页PPT元宇宙研究报告.pdf&#xff08;附下载链接&#xff09;机器学习在B站推荐系统中的应用实践小红书推荐系统…

【Matplotlib绘制图像大全】(三十):Matplotlib绘制时间线图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

[附源码]计算机毕业设计医疗纠纷处理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

在浏览器中运行 TensorFlow.js 来训练模型并给出预测结果(Iris 数据集)

文章目录开发环境构建第一个 TensorFlow.js 模型构建鸢尾花数据集分类器References在 《TensorFlow Lite 是什么&#xff1f;用 TensorFlow Lite 来转换模型&#xff08;附代码&#xff09;》中我们已经介绍了可以帮助 TensorFlow 模型在移动设备以及嵌入式设备中运行的 Tensor…

YMTC X3 NAND 232L 终露真容,全球领先|国产芯之光

上一篇文章&#xff08;芯片级解密YMTC NAND Xtacking 3.0技术&#xff09;&#xff0c;我们结合TechInsights获取芯片级信息梳理了国产NAND芯片厂商YMTC的技术演进之路&#xff0c;从2016公司成立&#xff0c;2018年发布Xtacking 1.0 NAND架构&#xff0c;2019年发布Xtacking …

Kotlin高仿微信-第58篇-开通VIP

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

[附源码]计算机毕业设计springboot疫情网课管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微信小程序| 做一款多人实时线上的五指棋联机游戏

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; …

[附源码]计算机毕业设计新能源汽车租赁Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计疫情物资管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…