• linux读写锁


    读写锁是一个可以分写状态和读状态的锁,可以分别加上写状态或读状态的锁。在读模式的锁下,所有试图以读模式获得它进行加锁的线程都可以获得锁,所有希望以写模式获得它的都会被阻塞。在写模式下,读写锁都被阻塞。读写锁又成共享互斥锁。

    简单的说,读模式的加锁下,所有进程都可以获得读锁,但都不能获得写锁。

    在写模式下,读写锁就变成了互斥锁,只有一个线程可以获得锁。

    例子:

    4个线程,全都加锁,不释放锁。

    1、互斥锁:

    在线程4获得锁后,由于不释放锁,所以后续的进程都得不到锁。

    2、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
    ",index);
        
        //pthread_mutex_unlock(&mutex);never unlock
        }
        else
        printf("con not get lock in thread 1
    ");
    
        if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
            printf("con not write in thread 1
    ");
    
        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
    ",index);
        i++;
        //pthread_mutex_unlock(&mutex);never unlock
        }
        else
        printf("con not get lock in thread 2
    ");
    
        
    
        if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
            printf("con not write in thread 2
    ");
    
        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
    ",index);
        
        //pthread_mutex_unlock(&mutex);never unlock
        }
        else
        printf("con not get lock in thread 3
    ");
        i++;
    
        if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
            printf("con not write in thread 3
    ");
            
            
        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
    ",index);
        
        }
        //pthread_mutex_unlock(&mutex);never unlock
        else
        printf("con not get lock in thread 4
    ");
    
        if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
            printf("con not write in thread 4
    ");
            
        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);
    
    
    
    }
  • 相关阅读:
    解决maven update project 后项目jdk变成1.5的问题
    applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
    SQL0668N 不允许对表"xxx"执行操作,原因码为 "1"
    maven下的jar项目打包的方法
    spring security 4.2后出现CouldnotverifytheprovidedCSRFtokenbecauseyoursessionwasnotfound
    maven-javadoc-plugin 出现错误Unsupported major.minor version 51.0
    通过 Spring Security配置 解决X-Frame-Options deny 造成的页面空白 iframe调用问题
    yaml模块
    centos 下 yum安装python3
    Python 之ConfigParser模块
  • 原文地址:https://www.cnblogs.com/wzben/p/5432518.html
Copyright © 2020-2023  润新知