2线程同步:读写锁
1讀寫鎖
讀共享,寫?yīng)氄?/span>
2讀寫鎖說明
讀寫鎖與互斥量類似,不過讀寫鎖的并行性更高。
讀寫鎖可以有三種狀態(tài):
A讀模式加鎖
B寫模式加鎖
C不加鎖
3在寫加鎖狀態(tài)時,在解鎖之前,所有試圖對這個鎖加鎖的線程都會被阻塞。在讀加鎖狀態(tài)時,所有試圖以讀模式對它進(jìn)行加鎖的線程都可以得到訪問權(quán)限。但是如果線程希望以寫模式加鎖,它必須阻塞,直到所有的線程釋放讀鎖。
4讀寫鎖很適合對于數(shù)據(jù)結(jié)構(gòu)讀的次數(shù)遠(yuǎn)大于寫的情況。
5.相關(guān)函數(shù)
int pthread_rwlock_init(pthread_rwlock_t*restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t*rwlock)? //成功則返回0,失敗則返回錯誤代碼
int pthread_rwlock_rdlock(pthread_rwlock_t*restrict rwlock) ;//讀模式加鎖
int pthread_rwlock_wrlock(pthread_rwlock_t*restrict rwlock);//寫模式加鎖
int pthread_rwlock_unlock(pthread_rwlock_t*restrick rwlock);
intpthread_rwlock_tryrdlock(pthread_rwlock_t *restrict rwlock);
intpthread_rwlock_trywrlock(pthread_rwlock_t *restrict rwlock);
intpthread_rwlock_trywrlock(pthread_rwlock_t *restrict rwlock);
6案例說明
| #include<stdio.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> ? int counter; //定義一把讀寫鎖 pthread_rwlock_t rwlock; ? //業(yè)務(wù)場景:3個線程不定時寫同一全局資源, //5個線程不定時讀同一個全局資源 void *th_write(void *arg) { ???int t; ???while(1) { ???????//上鎖 ???????pthread_rwlock_wrlock(&rwlock); ???????t = counter; ???????//休眠100微妙 ???????usleep(100); ???????printf("write %x : counter = %d ++counter=%d\n", ???????????(int)pthread_self(),t,++counter); ???????//解鎖 ???????pthread_rwlock_unlock(&rwlock); ???????usleep(100); ???} } ? void *th_read(void *arg) { ???while(1) { ???????pthread_rwlock_rdlock(&rwlock); ???????printf("read %x : %d\n",(int)pthread_self(),counter); ???????pthread_rwlock_unlock(&rwlock); ???????usleep(100); ???} } ? /*特點(diǎn)是讀時和寫時都上鎖*/ int main(void) { ???int i; ???pthread_t tid[8]; ???//初始鎖 ???pthread_rwlock_init(&rwlock,NULL); ???for(i = 0;i < 3;i++) { ???????pthread_create(&tid[i],NULL,th_write,NULL); ???} ???for(i = 0; i<5;i++) { ???????//從第四個開始 ???????pthread_create(&tid[i+3],NULL,th_read,NULL); ???} ???pthread_rwlock_destroy(&rwlock); ???for(i = 0;i< 8;i++) { ???????pthread_join(tid[i],NULL); ???} ???return 0; } |
通過給讀寫都加鎖,讓讀寫不會出現(xiàn)異常。
?
?
?????????????????????????????????????????????????????????????????????????????????????????????????????????
總結(jié)
- 上一篇: 进入bios以后怎么启动不了怎么回事 进
- 下一篇: 3线程同步:条件变量