读写锁(二)

一、实验项目

问题描述】程序 trainticket 中,有 100 个线程,其中 90 个线程是查余票数量的,只有 10 个线程抢票,每个线程一次买 10 张票。初始状态下一共有 1000 张票。因此执行完毕后,还会剩下 900 张票。

程序 trainticket 在运行的时候需要传入参数,即:

  • 参数 0:表示不加任何锁
  • 参数 1:表示使用读写锁
  • 参数 2:表示使用互斥量

测试代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>struct Ticket 
{int remain;              // 余票数,初始化为 1000pthread_rwlock_t rwlock; // 读写锁pthread_mutex_t mlock;   // 互斥锁,主要是为了和读写锁进行对比
}ticket;// 通过命令行传参数来取得这个值,用来控制到底使用哪一种锁
// 0:不加锁 1:加读写锁 2:加互斥锁
int lock = 0;void* query(void* arg)  //查票线程
{int name = (int)arg;sleep(rand() % 5 + 1);if (lock == 1)pthread_rwlock_rdlock(&ticket.rwlock); // 读模式加锁else if (lock == 2)pthread_mutex_lock(&ticket.mlock);int remain = ticket.remain;sleep(1);printf("%03d query: %d\n", name, remain);if (lock == 1)pthread_rwlock_unlock(&ticket.rwlock);else if (lock == 2)pthread_mutex_unlock(&ticket.mlock);return NULL;
}void* buy(void* arg)  // 抢票线程
{int name = (int)arg;if (lock == 1)pthread_rwlock_wrlock(&ticket.rwlock); // 写模式加锁else if (lock == 2)pthread_mutex_lock(&ticket.mlock);int remain = ticket.remain;remain -= 10; // 一次买 10 张票sleep(1);ticket.remain = remain;printf("%03d buy 10 tickets\n", name);if (lock == 1)pthread_rwlock_unlock(&ticket.rwlock);else if (lock == 2)pthread_mutex_unlock(&ticket.mlock);sleep(rand() % 5 + 2);return NULL;
}int main(int argc, char* argv[]) 
{lock = 0;if (argc >= 2) lock = atoi(argv[1]);int names[100];pthread_t tid[100];int i;for (i = 0; i < 100; ++i) names[i] = i;ticket.remain = 1000;printf("remain ticket = %d\n", ticket.remain);pthread_rwlock_init(&ticket.rwlock, NULL);pthread_mutex_init(&ticket.mlock, NULL);for (i = 0; i < 100; ++i) {if (i % 10 == 0)pthread_create(&tid[i], NULL, buy, (void*)names[i]);elsepthread_create(&tid[i], NULL, query, (void*)names[i]);}for (i = 0; i < 100; ++i) pthread_join(tid[i], NULL);pthread_rwlock_destroy(&ticket.rwlock);pthread_mutex_destroy(&ticket.mlock);printf("remain ticket = %d\n", ticket.remain);return 0;
}

 

输出结果:不加锁

sunbin@sunbin-virtual-machine:~$ ./a.out 0
remain ticket = 1000
010 buy 10 tickets
020 buy 10 tickets
030 buy 10 tickets
000 buy 10 tickets
050 buy 10 tickets
060 buy 10 tickets
070 buy 10 tickets
080 buy 10 tickets
090 buy 10 tickets
040 buy 10 tickets
021 query: 990
036 query: 990
017 query: 990
031 query: 990
011 query: 990
005 query: 1000
043 query: 990
058 query: 990
063 query: 990
067 query: 990
069 query: 990
071 query: 990
075 query: 990
082 query: 990
084 query: 990
096 query: 990
025 query: 990
022 query: 990
014 query: 990
024 query: 990
019 query: 990
012 query: 990
007 query: 990
047 query: 990
048 query: 990
052 query: 990
061 query: 990
062 query: 990
064 query: 990
042 query: 990
068 query: 990
074 query: 990
076 query: 990
098 query: 990
091 query: 990
029 query: 990
027 query: 990
026 query: 990
035 query: 990
033 query: 990
023 query: 990
015 query: 990
002 query: 990
016 query: 990
004 query: 990
008 query: 990
045 query: 990
049 query: 990
055 query: 990
066 query: 990
073 query: 990
079 query: 990
083 query: 990
085 query: 990
089 query: 990
034 query: 990
001 query: 990
032 query: 990
018 query: 990
009 query: 990
006 query: 990
046 query: 990
051 query: 990
056 query: 990
059 query: 990
065 query: 990
078 query: 990
088 query: 990
093 query: 990
094 query: 990
095 query: 990
097 query: 990
038 query: 990
037 query: 990
028 query: 990
003 query: 990
013 query: 990
044 query: 990
053 query: 990
054 query: 990
057 query: 990
072 query: 990
077 query: 990
081 query: 990
041 query: 990
086 query: 990
087 query: 990
092 query: 990
099 query: 990
039 query: 990
remain ticket = 990

输出结果:读写锁

sunbin@sunbin-virtual-machine:~$ ./a.out 1
remain ticket = 1000
010 buy 10 tickets
008 query: 990
003 query: 990
015 query: 990
019 query: 990
029 query: 990
001 query: 990
054 query: 990
055 query: 990
059 query: 990
067 query: 990
064 query: 990
068 query: 990
073 query: 990
079 query: 990
082 query: 990
088 query: 990
009 query: 990
004 query: 990
012 query: 990
023 query: 990
024 query: 990
021 query: 990
018 query: 990
042 query: 990
043 query: 990
047 query: 990
057 query: 990
061 query: 990
065 query: 990
058 query: 990
066 query: 990
072 query: 990
074 query: 990
092 query: 990
097 query: 990
006 query: 990
011 query: 990
013 query: 990
014 query: 990
026 query: 990
028 query: 990
022 query: 990
031 query: 990
033 query: 990
035 query: 990
036 query: 990
039 query: 990
044 query: 990
051 query: 990
063 query: 990
071 query: 990
077 query: 990
081 query: 990
084 query: 990
089 query: 990
005 query: 990
007 query: 990
017 query: 990
025 query: 990
032 query: 990
037 query: 990
041 query: 990
046 query: 990
052 query: 990
056 query: 990
062 query: 990
076 query: 990
087 query: 990
091 query: 990
093 query: 990
094 query: 990
096 query: 990
002 query: 990
016 query: 990
027 query: 990
034 query: 990
038 query: 990
045 query: 990
048 query: 990
049 query: 990
053 query: 990
069 query: 990
075 query: 990
078 query: 990
083 query: 990
085 query: 990
086 query: 990
095 query: 990
098 query: 990
099 query: 990
030 buy 10 tickets
040 buy 10 tickets
000 buy 10 tickets
050 buy 10 tickets
060 buy 10 tickets
070 buy 10 tickets
080 buy 10 tickets
090 buy 10 tickets
020 buy 10 tickets
remain ticket = 900

输出结果:互斥锁

sunbin@sunbin-virtual-machine:~$ ./a.out 2
remain ticket = 1000
010 buy 10 tickets
011 query: 990
030 buy 10 tickets
050 buy 10 tickets
040 buy 10 tickets
060 buy 10 tickets
070 buy 10 tickets
080 buy 10 tickets
000 buy 10 tickets
090 buy 10 tickets
005 query: 910
016 query: 910
020 buy 10 tickets
021 query: 900
032 query: 900
044 query: 900
055 query: 900
056 query: 900
001 query: 900
064 query: 900
067 query: 900
068 query: 900
073 query: 900
079 query: 900
082 query: 900
088 query: 900
007 query: 900
012 query: 900
014 query: 900
019 query: 900
022 query: 900
002 query: 900
024 query: 900
039 query: 900
048 query: 900
037 query: 900
058 query: 900
059 query: 900
061 query: 900
065 query: 900
066 query: 900
072 query: 900
074 query: 900
097 query: 900
093 query: 900
008 query: 900
004 query: 900
003 query: 900
015 query: 900
023 query: 900
026 query: 900
029 query: 900
042 query: 900
034 query: 900
035 query: 900
041 query: 900
028 query: 900
043 query: 900
052 query: 900
063 query: 900
071 query: 900
077 query: 900
081 query: 900
084 query: 900
089 query: 900
006 query: 900
009 query: 900
018 query: 900
025 query: 900
047 query: 900
031 query: 900
038 query: 900
036 query: 900
053 query: 900
057 query: 900
062 query: 900
076 query: 900
087 query: 900
096 query: 900
098 query: 900
099 query: 900
094 query: 900
013 query: 900
017 query: 900
027 query: 900
033 query: 900
046 query: 900
045 query: 900
049 query: 900
051 query: 900
054 query: 900
069 query: 900
075 query: 900
078 query: 900
083 query: 900
085 query: 900
086 query: 900
095 query: 900
092 query: 900
091 query: 900
remain ticket = 900

二、参考资料:

1. 2-读写锁 rwlock

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

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

相关文章

不看绝对血亏!java字符串转json

一、对Kafka的认识 1.Kafka的基本概念 2.安装与配置 3.生产与消费 4.服务端参数配置 二、生产者 1.客户端开发 必要的参数配置消息的发送序列化分区器生产者拦截器 2.原理分析 整体架构元数据的更新 3.重要的生产者参数 三、消费者 1.消费者与消费组 2.客户端开发 必要的…

【线程】屏障

一、主要函数应用 1. 函数原型&#xff1a;初始化和回收 int pthread_barrier_init(pthread *barrier, const pthread_barrier_t *attr, unsigned int count); int pthread_barrier_destroy(pthread_barrier_t *barrier);分析&#xff1a; 初始化屏障时&#xff0c;可以使用c…

中高级工程师Java开发!java生成随机数代码包

微服务是什么 微服务起源于2005年Peter Rodgers博士在云端运算博览会提出的微Web服务(Micro-Web-Service)&#xff0c;根本思想类似于Unix的管道设计理念。2014年&#xff0c;由Martin Fowler 与 James Lewis共同提出了微服务的概念&#xff0c;定义了微服务架构风格是一种通过…

Java软件开发面试题!hr和技术经理一起面

springspring5最全知识梳理大纲&#xff08;总&#xff09; spring最全知识梳理大纲&#xff08;总&#xff09; spring5最全知识梳理大纲&#xff08;总&#xff09; spring最全知识梳理大纲&#xff08;分&#xff09; 为什么要使用Spring&#xff1f; Bean spring事务 面向…

XSI IPC

一、查询IPC的命令 显示&#xff1a; ipcs -a 显示所有共享内核对象 ipcs -m 显示共享内存 m memory ipcs -q 消息队列 q queue ipcs -s 显示信号量 s semphore删除&#xff1a; ipcrm -m ID 删除共享内存 ipcrm -q ID 删除共享队列 ipcrm -s ID 删除信号量 二…

Java进阶之光!javaunicode码转字符

01 如何理解高并发&#xff1f; 高并发意味着大流量&#xff0c;需要运用技术手段抵抗流量的冲击&#xff0c;这些手段好比操作流量&#xff0c;能让流量更平稳地被系统所处理&#xff0c;带给用户更好的体验。 我们常见的高并发场景有&#xff1a;淘宝的双11、春运时的抢票、…

Java进阶之光!java字符串类型转换为int

阿里巴巴篇 1.扎实的计算机专业基础&#xff0c;包括算法和数据结构&#xff0c;操作系统&#xff0c;计算机网络&#xff0c;计算机体系结构&#xff0c;数据库等2.具有扎实的Java编程基础&#xff0c;理解IO、多线程等基础框架3.熟练使用Linux系统的常用命令及shell有一定了…

Java进阶之光!mysql创建用户并授权建表

正文 MyBatis 的整体架构分为三层&#xff0c; 分别是基础支持层、核心处理层和接口层&#xff0c;如下图所示。 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装&#xff0c;提供了更加简洁易用的 API &#xff0c;方便上层使调用&#xff0c;并且对反射操作…

System V 信号量

一、System V 信号量 1.信号量linux命令 显示&#xff1a; ipcs -a 显示所有共享内核对象 ipcs -s 显示信号量 s semphore删除&#xff1a; ipcrm -s ID 删除信号量 二、主要函数应用 1. 函数原型&#xff1a; #include <sys/sem.h> int semget(key_t key, int …

Java进阶之光!mysql安装包安装教程

我听到的一些发声 你们赚的钱已经可以了&#xff1a; 我一个发小是做土木工程的&#xff0c;上海大学博士&#xff0c;参与很多著名建筑的工程&#xff0c;但是从薪资上看&#xff0c;还不如一些稍微像样的公司的6年多的高级开发。为什么&#xff1f;这就是行业的红利&#xf…

Java进阶学习资料!dockerjar内存

准备好套路 **①自我介绍&#xff1a;**千万不能筐瓢&#xff0c;一定要牢记&#xff0c;自然流畅地介绍自己的学习经历、工作经历、项目经历、个人优势等等&#xff1b; **②抽象概念&#xff1a;**当面试官问你是如何理解多线程的时候&#xff0c;你要知道从定义、来源、实…

管道(二)

无名管道 测试代码&#xff1a; #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <string.h>#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); }while(0) #define TEST_SIZE 68*1024int mai…

Java进阶:java字符串定位语句

正文 模块&#xff08;Module&#xff09;、组件&#xff08;Component&#xff09;、包&#xff08;Package&#xff09;&#xff0c;这些概念对于我们技术同学并不陌生&#xff0c;但并不是所有人都能理解其要义。 深入理解之后&#xff0c;我才发现&#xff0c;其背后的深…

有名管道

一、有名管道 1. 为何提出有名管道的说法&#xff0c;目的是为了克服无名管道的不足之处&#xff1a; 无名管道只能是用于具有亲缘关系的进程之间&#xff0c;这就限制了无名管道的使用范围。有名管道可以使互不相关的两个进程互相通信&#xff0c;有名管道可以通过路径名来指…

Java进阶:mysql的事务隔离级别面试题

一面&#xff1a; 阿里巴巴面试答案文末可以领取&#xff01; 1. 触发新生代GC&#xff0c;如果存活对象总量大于survivor区容量&#xff0c;咋办 2. 如果任务很多&#xff0c;线程池的阻塞队列会撑爆内存的哪个区域 3. 栈在堆上吗 4. GC root有哪些 5. 实例变量可以是GC…

有名管道(二)

一、从FIFO中读取数据&#xff1a; 约定&#xff1a;如果一个进程为了从FIFO中读取数据而以阻塞的方式打开FIFO&#xff0c;则称内核为该进程的读操作设置了阻塞标志。 如果有进程为写而打开FIIF&#xff08;写端存在&#xff09;&#xff0c;且当前FIFO内没有数据&#xff0…

Java面试2021,java数据可视化项目

AOP简介 AOP (Aspect Oriented Programing) 称为&#xff1a;面向切面编程&#xff0c;它是一种编程思想。AOP 是 OOP&#xff08;面向对象编程 Object Oriented Programming)的思想延续 AOP采取横向抽取机制&#xff0c;取代了传统纵向继承体系重复性代码的编写方式&#xff0…

gcc的使用

一、gcc编译过程示意图 分析&#xff1a; hello程序是一个高级&#xff23;语言程序&#xff0c;这种形式容易被人读懂。为了在系统上运行hello.c程序&#xff0c;每条&#xff23;语句都必须转化为低级机器指令。然后将这些指令打包成可执行目标文件格式&#xff0c;并以二进…

Java面试2021,java黑马百度云

线程是否要锁住同步资源 锁住 悲观锁不锁住 乐观锁 锁住同步资源失败 线程是否要阻塞 阻塞不阻塞自旋锁&#xff0c;适应性自旋锁 多个线程竞争同步资源的流程细节有没有区别 不锁住资源&#xff0c;多个线程只有一个能修改资源成功&#xff0c;其它线程会重试无锁同一个线…

gdb使用

[sunbinlocalhost ~]$ gcc -Wall -g simple.c -o simple [sunbinlocalhost ~]$ ./simple Entering main ... result[1-100] 5050 result[1-10] 55 Exiting main ... [sunbinlocalhost ~]$ gdb simple 启动gdb GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-110.el7 Copyrigh…