zoukankan      html  css  js  c++  java
  • 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);
    
    
    
    }
  • 相关阅读:
    学习进度条第十周
    学习进度条第九周
    结巴分词python
    竞品分析
    学期总结(一)------文献挖掘
    分类结果评估
    scrapy 爬虫怎么写入日志和保存信息
    Python 安装 imread报错
    Python爬虫爬中文却显示Unicode,怎样显示中文--问题解答
    Python网络数据采集二
  • 原文地址:https://www.cnblogs.com/wzben/p/5432518.html
Copyright © 2011-2022 走看看