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 }
因为锁的消耗是比较大的的,所以加锁的临界区越小越好。