linux 读写锁
转载自https://www.cnblogs.com/wzben/p/5432518.html
读写锁是一个可以分写状态和读状态的锁,可以分别加上写状态或读状态的锁。在读模式的锁下,所有试图以读模式获得它进行加锁的线程都可以获得锁,所有希望以写模式获得它的都会被阻塞。在写模式下,读写锁都被阻塞。读写锁又成共享互斥锁。
简单的说,读模式的加锁下,所有进程都可以获得读锁,但都不能获得写锁。
在写模式下,读写锁就变成了互斥锁,只有一个线程可以获得锁。
例子:
4个线程,全都加锁,不释放锁。
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include<fcntl.h>
#include <pthread.h>
#include <errno.h>
int index = 1;
pthread_rwlock_t rwlock;
pthread_mutex_t mutex;
void fun1(void){
int i = 0;
while(i<50){
//if(pthread_mutex_trylock(&mutex)==0){
if(pthread_rwlock_tryrdlock(&rwlock)==0){
printf("In thread 1,lock,index is %d\n",index);
//pthread_mutex_unlock(&mutex);never unlock
}
else
printf("con not get lock in thread 1\n");
if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
printf("con not write in thread 1\n");
i++;
usleep(100);
}
}
void fun2(void){
int i = 0;
while(i<50){
//if(pthread_mutex_trylock(&mutex)==0){
if(pthread_rwlock_tryrdlock(&rwlock)==0){
printf("In thread 2,lock,index is %d\n",index);
i++;
//pthread_mutex_unlock(&mutex);never unlock
}
else
printf("con not get lock in thread 2\n");
if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
printf("con not write in thread 2\n");
i++;
usleep(100);
}
}
void fun3(void){
int i = 0;
while(i<50){
//if(pthread_mutex_trylock(&mutex)==0){
if(pthread_rwlock_tryrdlock(&rwlock)==0){
printf("In thread 3,lock,index is %d\n",index);
//pthread_mutex_unlock(&mutex);never unlock
}
else
printf("con not get lock in thread 3\n");
i++;
if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
printf("con not write in thread 3\n");
usleep(100);
}
}
void fun4(void){
int i = 0;
while(i<50){
//if(pthread_mutex_trylock(&mutex)==0){
if(pthread_rwlock_tryrdlock(&rwlock)==0){
printf("In thread 4,lock,index is %d\n",index);
}
//pthread_mutex_unlock(&mutex);never unlock
else
printf("con not get lock in thread 4\n");
if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
printf("con not write in thread 4\n");
i++;
usleep(100);
}
}
int main(){
pthread_t tid1,tid2,tid3,tid4;
pthread_mutex_init(&mutex,NULL);
pthread_create(&tid1,NULL,(void*)fun1,NULL);
pthread_create(&tid2,NULL,(void*)fun2,NULL);
pthread_create(&tid3,NULL,(void*)fun3,NULL);
pthread_create(&tid4,NULL,(void*)fun4,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
pthread_join(tid4,NULL);
}
1、互斥锁:
在线程4获得锁后,由于不释放锁,所以后续的进程都得不到锁。
2、4个进程加上读锁
由于读锁是共享的,所以就算不释放读锁,每个进程都能获得该锁。
同时,再加上读锁的同时,是不可以写操作的,就是说不能获取写模式。
还没有评论,来说两句吧...