




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、進程通信之讀寫鎖讀寫鎖讀寫鎖的分配規則 1. 沒有線程持有讀寫鎖進行寫,任意數量的線程可以持有該讀寫鎖用于讀 2. 只有沒有線程持有給定的讀寫鎖用于讀或者寫的時候,才能分配讀寫鎖用于寫。 如果修改數據頻繁,那么可以考慮用讀寫鎖替代互斥鎖。獲取與釋放如果對應的讀寫鎖已由某個寫入者持有,那么阻塞pthread_rwlock_rdlock獲取讀出鎖如果對應的讀寫鎖已由另一個寫入者持有,那就阻塞pthread_rwlock_wrlock獲取寫入鎖。pthread_rwlock_unlock用于釋放讀出鎖或者寫入鎖。 三者成功時返回0,出錯時返回正的錯誤值pthread_rwlock_tryrdlock
2、(pthread _rwlock_t *rwptr)嘗試獲取讀出鎖,如果不能馬上獲得,返回EBUSY錯誤。pthread_rwlock_trywrlock(pthread _rwlock_t *rwptr)嘗試獲取寫入鎖,如果不能馬上獲得,返回EBUSY錯誤。初始化和摧毀動態初始化 int pthread_rwlock_init(pthread_rwlock_t *rwptr, const pthread_rwlockattr_t *attr)靜態初始化 PTHREAD_RWLOCK_INITIALIZER摧毀 int pthread_rwlock_destroy(pthread_rwlock
3、_t *rwptr)屬性設置int pthread_rwlockattr_init(pthread_rwlockattr_t * attr)int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr)int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * attr,int *valptr)int pthread_rwlockattr_setpshared(pthread_rwlockattr_t * attr,int val)讀寫鎖很適合讀的次數遠大于寫的次數的情況。
4、例子: 一個寫者,多個讀者。用讀寫鎖進行協調工作。 code:#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>struct data int number; char info105;struct data *pdata = NULL; pthread_rwlock_t lock;void *read(void *arg) int id = *(int *)arg); while(1) int ret; ret = pthread_rwlock
5、_tryrdlock(&lock); if(ret != 0) continue; printf("reader %d is reading!n",id); if(pdata = NULL) printf("data is null.n"); else printf("data: number is %d, info are %s.n",pdata->number,pdata->info); pthread_rwlock_unlock(&lock); pthread_exit(0);void *write(
6、void *arg) int id = *(int *)arg); while(1) int ret; ret = pthread_rwlock_trywrlock(&lock); if(ret !=0) continue; printf("writer %d is writing!n",id); if(pdata = NULL) pdata = (struct data *)malloc(sizeof(struct data); pdata->number = 1; strcpy(pdata->info,"I love linux."
7、;); printf("finish, wrote it.n"); else printf("the pdata is not null.n"); pthread_rwlock_unlock(&lock); pthread_exit(0);int main() pthread_t reader10; pthread_t writer; int i; pthread_create(&writer,NULL,write,(void *)&i); for(i=0; i<10; i+) pthread_create(&rea
8、deri,NULL,read,(void *)&i); /pthread_create(&writer,NULL,write,NULL); if(pdata != NULL) free(pdata); getchar(); return 0;運行:writer 1 is writing!finish, wrote it.reader 2 is reading!data: number is 1, info are I love linux.writer 1 is writing!the pdata is not null.reader 2 is reading!data: nu
9、mber is 1, info are I love linux.reader 2 is reading!data: number is 1, info are I love linux.線程取消函數: int pthread_cancel(pthread_t tid) 一個線程可以被同一進程中的其他線程取消。 與之對應的自愿終止: void pthread_exit(void *retval)#include <stdio.h>#include <unistd.h>#include "unix98.h"#include <pthread.h&
10、gt;pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;pthread_t tid1, tid2;void *thread1(void *), *thread2(void *);int main() pthread_setconcurrency(2); pthread_create(&tid1,NULL,thread1,NULL); sleep(1); /* let tid2 get lock. */ pthread_create(&tid2,NULL,thread2,NULL); void *status; /* sto
11、re returned value from waited tid */ pthread_join(tid2,&status); if(status != PTHREAD_CANCELED) printf("thread2 status = %p n", status); pthread_join(tid1, &status); if(status != NULL) printf("thread1 status = %pn",status); /printf("rw_refcount = %d, rw_nwaitreaders
12、= %d, rw_nwaitwriter = %dn", / rwlock.rw_refcount,rwlock.rw_nwaitreaders, rwlock.rw_nwaitwriters); pthread_rwlock_troy(&rwlock); return 0;void *thread1(void *arg) pthread_rwlock_rdlock(&rwlock); printf("thread1 got a read lock.n"); sleep(3); /* let thread2 block in pthread_rwl
13、ock_wrlock */ pthread_cancel(tid2); sleep(3); pthread_rwlock_unlock(&rwlock); return NULL;void *thread2(void *arg) printf("thread2 try to obtain a write lock.n"); pthread_rwlock_wrlock(&rwlock); printf("thread2() get a write lock.n"); sleep(1); pthread_rwlock_unlock(&
14、rwlock); return NULL;./pthread_cancel thread1 got a read lock.thread2 try to obtain a write lock.thread2() get a write lock.1234fcntl函數和讀寫鎖文件鎖:建議性鎖,強制性鎖 lock結構體:Struct flockshort l_type;off_t l_start;short l_whence;off_t l_len;pid_t l_pid;flock可施加建議性鎖,fcntl既可以施加建議性鎖,也可施加強制性鎖。 fcntl也可以對某一記錄進行上鎖,也就是所謂
15、的記錄鎖。記錄鎖分為讀取鎖(共享鎖),寫入鎖(排斥鎖,互斥鎖)。 fcntl建立記錄鎖: 下面是一個學習的例子,參考 使用fcntl增加和釋放鎖:#include <unistd.h>#include <sys/types.h>#include <fcntl.h>#include <stdio.h>#include <sys/stat.h>#include <stdlib.h>void lock_set(int fd,int type) struct flock lock; lock.l_whence = SEEK_SET
16、; /* 相對位移量的起點是文件的開頭 */ lock.l_start = 0; /* 相對位移量 */ lock.l_len = 0; /* 加鎖區域的長度 */ while(1) lock.l_type=type; if(fcntl(fd,F_SETLK,&lock) = 0) if(lock.l_type = F_RDLCK) printf("read lock by %dn", getpid(); else if(lock.l_type = F_WRLCK) printf("write lock by %dn", getpid(); el
17、se if(lock.l_type = F_UNLCK) printf("release lock by %dn", getpid(); return ; fcntl(fd,F_GETLK,&lock); if(lock.l_type != F_UNLCK) if(lock.l_type = F_RDLCK) printf("read lock already set by %dn",lock.l_pid); else if(lock.l_type = F_WRLCK) printf("write lock already set by
18、 %dn",lock.l_pid); printf("please enter any key to continue: "); getchar(); int main() int fd = open("path",O_RDWR | O_CREAT, 0755); /* 當前路徑下創建path */ if(fd = -1) perror("open: "); exit(1); lock_set(fd,F_WRLCK); puts("wait for a secend.n"); sleep(6); lock
19、_set(fd,F_UNLCK); puts("wait for a secend.n"); sleep(1); close(fd); exit(0);不修改上面的代碼,試試寫入鎖 + 寫入鎖, 看看效果。 在不同的標簽內運行此程序:write + write./writewrite lock by 2904wait for a secend.release lock by 2904wait for a secend./writewrite lock already set by 2904please enter any key to continue: write loc
20、k already set by 2904please enter any key to continue: write lock by 2905wait for a secend.release lock by 2905wait for a secend.在已有write鎖的情況下不能加上write鎖。 現在,稍作修改lock_set(fd,F_WRLCK);->lock_set(fd,F_RDLCK);write + read./write write lock by 3005wait for a secend.release lock by 3005wait for a secend./read write lock already set by 3005please enter any key to continue: write lock already set by 3005please enter any key to continue: write lock already set by 3005please enter any key to continue: read lock by 3006wait for a secend.release lock by 300
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園2024-2025年親子活動計劃
- 2025年捕蠅器項目市場調查研究報告
- 時尚管理專業畢業實習總結
- 寫冬初二作文550字冬天滿分作文13篇范文
- 中國書法介紹課件
- 2025年巖棉半硬板項目市場調查研究報告
- 能源項目實施成本控制方案
- 寫景作文?;~塘400字8篇
- 做蛋炒飯說明文600字初中8篇
- 一年級狀物作文小兔臺燈100字13篇范文
- 國有企業干部選拔任用條例
- 辦理居住證工作證明 (模板)
- 中藏醫適宜技術課件
- 通用造價35kV~750kV線路(國網)課件
- 2022年廣東省深圳市中考化學真題試卷
- 工貿企業有限空間作業場所安全管理臺賬
- 國際財務管理教學ppt課件(完整版)
- DB33∕T 715-2018 公路泡沫瀝青冷再生路面設計與施工技術規范
- 彩色簡約魚骨圖PPT圖表模板
- 光引發劑的性能與應用
- PID控制經典PPT
評論
0/150
提交評論