zoukankan      html  css  js  c++  java
  • 线程相关函数(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

    ...

  • 相关阅读:
    zoj 1610(明天做)
    在C#中ParameterizedThreadStart和ThreadStart区别
    datagridview显示行号
    不允许对64位应用程序进行修改”的解决方法
    SQL查询表和存储过程创建修改日期
    推荐一个代码自动完成的工具AutoCode
    .net中的认证(authentication)与授权(authorization)
    SQL语句使用总结(二)
    C#/WinForm给控件加入hint文字
    sql server 2008 express 安装的时提示“重启计算机失败"
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8268152.html
Copyright © 2011-2022 走看看