线程同步之读写锁

1.读写锁是几个锁?

       一个锁。pthrad_rwlock_t lock;

2.读写锁的类型
            读锁:对内存做读操作
            写锁:对内存做写操作
3.读写锁的特性
            线程A加读锁成功,又来三个线程做读操作,可以加锁成功
                多个线程在读的时候可以共享,可以并行去处理
            线程A加写锁成功,又来了三个线程,三个线程阻塞
                写操作独占
            线程A加读锁成功,又来B线程加写锁阻塞,又来C线程加读锁阻塞
                读锁写锁不能同时加
                写的优先级高
            读写锁适用场景
                互斥锁 读写串行
                读写锁 读并行,写串行

4.主要函数

初始化读写锁

pthread_rwlock_init(
                    pthread_rwlock_t* rwlock,
                    const pthread_rwlockattr_t *restrict attr
                    );

销毁读写锁

pthread_rwlock_destroy(pthread_rwlock_t* rwlock);

加读锁

pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);

加写锁

pthread_rwlock_wrlock(pthread_rwlock_t* rwlock);

尝试加读锁

pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock);

尝试加写锁

pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock)

解锁

pthread_rwlock_unlock(pthread_rwlock_t* rwlock)

练习:3个线程不定时写同一文件,5个线程不定时读同一文件

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 #include<unistd.h>
  5 #include<string.h>
  6 
  7 //线程间通信需要创建一个全局变量
  8 int num;
  9 
 10 //创建读写锁
 11 pthread_rwlock_t lock;
 12 
 13 void* write_fun(void *arg)
 14 {
 15     while(1)
 16     {
 17         //在对全局变量执行写操作之前加写锁
 18         pthread_rwlock_wrlock(&lock);
 19         num++;
 20         printf("write pthid = %lu,num = %d\n",pthread_self(),num);
 21         //在使用完全局变量之后解锁
 22         pthread_rwlock_unlock(&lock);
 23         usleep(500);
 24     }
 25 
 26     return NULL;
 27 }
 28 
 29 void* read_fun(void *arg)
 30 {
 31     while(1)
 32     {
 33         //在对全局变量执行读操作之前加读锁
 34         pthread_rwlock_rdlock(&lock);
 35         printf("read pthid = %lu,num = %d\n",pthread_self(),num);
 36         //在用完全局变量之后解锁
 37         pthread_rwlock_unlock(&lock);
 38         usleep(500);
 39     }
 40 }
 41 
 42 int main()
 43 {
 44     //创建8个线程ID
 45     pthread_t pthid[8];
 46 
 47     //初始化读写锁
 48     pthread_rwlock_init(&lock,NULL);
 49     //创建3个写线程
 50     int i = 0;
 51     for(;i < 3;i++)
 52     {
 53         pthread_create(&pthid[i],NULL,write_fun,NULL);
 54     }
 55     //创建5个读锁
 56     int j = 3;
 57     for(;j < 8;j++)
 58     {
 59         pthread_create(&pthid[j],NULL,read_fun,NULL);
 60     }
 61 
 62 
 63     //对这8个线程进行回收
 64     int w = 0;
 65     for(;w < 8;w++)
 66     {
 67         pthread_join(pthid[w],NULL);
 68     }
 69 
 70     //在使用完锁之后一定要释放锁
 71     pthread_rwlock_destroy(&lock);
 72     return 0;
 73 }

因为锁的消耗是比较大的的,所以加锁的临界区越小越好。

上一篇:读写锁


下一篇:1