• 线程相关函数(5)-pthread_rwlock_rdlock(),pthread_rwlock_wrlock() 读写锁


    读共享,写独占

    pthread_rwlock_t
    pthread_rwlock_init
    pthread_rwlock_destroy
    pthread_rwlock_rdlock
    pthread_rwlock_wrlock
    pthread_rwlock_tryrdlock
    pthread_rwlock_trywrlock
    pthread_rwlock_unlock

    示例代码:

    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    
    static int counter;
    static pthread_rwlock_t rwlock;
    
    void *th_write(void *arg)
    {
        int t, i;
        for (i=0; i<5; i++) {
            pthread_rwlock_wrlock(&rwlock);
            t = counter;
            usleep(100);
            printf("Write Thread(%x) counter=%d, ++counter=%d
    ", (int)pthread_self(), t, ++counter);
            pthread_rwlock_unlock(&rwlock);
            usleep(100);
        }
    
    }
    
    
    void *th_read(void *arg)
    {
        while(1) {
            pthread_rwlock_rdlock(&rwlock);
            printf("Read Thread(%x) counter=%d
    ", (int)pthread_self(), counter);
            pthread_rwlock_unlock(&rwlock);
            usleep(100);
        }
    }
    
    
    int main()
    {
        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);
        for (i=0; i<8; i++)
            pthread_join(tid[i], NULL);
    
        pthread_rwlock_destroy(&rwlock);    
        return 0;
    }

    运行结果:

    Read Thread(f901e700) counter=0
    Read Thread(f981f700) counter=0
    Read Thread(f881d700) counter=0
    Read Thread(fa020700) counter=0
    Read Thread(fa821700) counter=0
    Write Thread(fb022700) counter=0, ++counter=1
    Write Thread(fb823700) counter=1, ++counter=2
    Write Thread(fc024700) counter=2, ++counter=3
    Write Thread(fb022700) counter=3, ++counter=4
    Write Thread(fb823700) counter=4, ++counter=5
    Write Thread(fc024700) counter=5, ++counter=6
    Write Thread(fb022700) counter=6, ++counter=7
    Write Thread(fb823700) counter=7, ++counter=8
    Write Thread(fc024700) counter=8, ++counter=9
    Write Thread(fb022700) counter=9, ++counter=10
    Write Thread(fb823700) counter=10, ++counter=11
    Write Thread(fc024700) counter=11, ++counter=12
    Write Thread(fb022700) counter=12, ++counter=13
    Write Thread(fb823700) counter=13, ++counter=14
    Write Thread(fc024700) counter=14, ++counter=15
    Read Thread(f901e700) counter=15
    Read Thread(f981f700) counter=15
    Read Thread(f881d700) counter=15
    Read Thread(fa020700) counter=15
    Read Thread(fa821700) counter=15
    Read Thread(f901e700) counter=15
    Read Thread(f981f700) counter=15
    Read Thread(f881d700) counter=15
    Read Thread(fa020700) counter=15

    ...

  • 相关阅读:
    计算机图形学之光栅图形学——反走样算法简介
    计算机图形学之光栅图形学——区域填充算法简介
    计算机图形学之光栅图形学——多边形的扫描转换算法简介
    计算机图形学——光栅图形学直线算法简介
    Kendall tau距离(即两个内容相同的数组中逆序数对的数量)(算法》P220 第2.5.3.2小节)
    自顶向下归并排序的应用——链表的随机化
    双调数组中的二分查找
    根据离散概率随机返回数组中的项
    字符串解析
    找出只出现一次的整数
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8268152.html
Copyright © 2020-2023  润新知