讀寫鎖(二)

一、實驗項目

問題描述】程序 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.pswp.cn/news/385538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385538.shtml
英文地址,請注明出處:http://en.pswp.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…