读写锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读写锁相关的知识,希望对你有一定的参考价值。

 1 /*
 2 *读者写者问题
 3 *问题描述
 4 *1)允许多位读者同时访问某数据,但是同一时间,只允许一位写者写入数据
 5 *2)当没有读者在读取数据的时候,才允许写者写入数据
 6 *3)当有写者正在写入数据的时候,不允许读者进行数据的读写
 7 *History:
 8 *2010/03/16    huangwei    First release
 9 */
10 
11 #include<stdio.h>
12 #include<unistd.h>
13 #include<pthread.h>
14 
15 #define        READER_MAX    3        /*最多允许多少人一起读取数据*/
16 #define        WRITER_MAX    2        /*最多允许多少人写数据*/
17 
18 pthread_rwlock_t    rw_lock;        /*读写锁*/
19 
20 /**
21 *reader_thread - 模拟读者进行数据读取
22 *@arg :  没有使用
23 */
24 
25 void* reader_thread(void *arg)
26 {
27     while(1) {
28         /*尝试加只读锁*/        
29         if(pthread_rwlock_tryrdlock(&rw_lock)) {
30             /*加只读锁不成功,打印信息,1秒钟后继续尝试*/
31             printf("读\t者%u暂时不能读取数据.\n", (unsigned int)pthread_self());
32             sleep(1);
33         } else {
34             /*加只读锁成功,显示哪位读者正在进行数据读取*/
35             printf("读\t者%u正在读取数据.\n", (unsigned int)pthread_self());
36             sleep(1);    /*读者正在读取数据*/
37             printf("读\t者%u读取数据完毕.\n", (unsigned int)pthread_self());
38             pthread_rwlock_unlock(&rw_lock); /*解只读锁*/
39             sleep(2);    /*休息一段时间后再尝试进行数据读取*/
40         }    
41     }
42 }
43 
44 /**
45 *writer_thread -  模拟写者写入数据
46 *@arg : 没有使用
47 */
48 
49 void* writer_thread(void *arg)
50 {
51     while(1) {
52         /*尝试加写锁*/
53         if(pthread_rwlock_trywrlock(&rw_lock)) {
54             /*加写锁不成功,输出信息,2秒后再继续尝试*/
55             printf("写者%u暂时不能写入数据\n", (unsigned int)pthread_self());
56             sleep(2);
57         } else {
58             /*加写锁成功,显示目前哪为写者正在进行数据写入*/
59             printf("写者%u正在写入数据.\n", (unsigned int)pthread_self());
60             sleep(2);    /*写者正在写入数据*/
61             printf("写者%u写入数据完毕.\n", (unsigned int)pthread_self());
62             pthread_rwlock_unlock(&rw_lock);
63             sleep(3);    /*休息一段时间后再尝试进行数据写入*/
64         }
65     }
66 }
67 
68 int main(int argc, char* argv[])
69 {
70     pthread_t reader, writer;/*记录读者和写者的线程号*/
71     
72     int i = 0;/*循环变量*/
73     
74     pthread_rwlock_init(&rw_lock, NULL);    /*初始化读写锁*/
75     
76     /*创建READER_MAX个读者*/
77     for(i = 0; i < READER_MAX; i++)    
78         pthread_create(&reader, NULL, (void *)reader_thread, NULL);
79 
80     /*创建WRITER_MAX个读者*/
81     for(i = 0; i < WRITER_MAX; i++)
82         pthread_create(&writer, NULL, (void *)writer_thread, NULL);
83     
84     sleep(10);/*程序运行10秒后退出*/
85     
86     return 0;
87 }

程序运行结果:

 1 读    者3434592000正在读取数据.
 2 读    者3426199296正在读取数据.
 3 读    者3417802496正在读取数据.
 4 写者3409409792暂时不能写入数据
 5 写者3401017088暂时不能写入数据
 6 读    者3434592000读取数据完毕.
 7 读    者3417802496读取数据完毕.
 8 读    者3426199296读取数据完毕.
 9 写者3409409792正在写入数据.
10 写者3401017088暂时不能写入数据
11 读    者3434592000暂时不能读取数据.
12 读    者3426199296暂时不能读取数据.
13 读    者3417802496暂时不能读取数据.
14 写者3409409792写入数据完毕.
15 写者3401017088正在写入数据.
16 读    者3434592000暂时不能读取数据.
17 读    者3417802496暂时不能读取数据.
18 读    者3426199296暂时不能读取数据.
19 读    者3426199296暂时不能读取数据.
20 读    者3417802496暂时不能读取数据.
21 读    者3434592000暂时不能读取数据.
22 写者3401017088写入数据完毕.
23 读    者3426199296正在读取数据.
24 读    者3417802496正在读取数据.
25 读    者3434592000正在读取数据.
26 写者3409409792暂时不能写入数据
27 读    者3426199296读取数据完毕.
28 读    者3434592000读取数据完毕.
29 读    者3417802496读取数据完毕.
30 写者3409409792正在写入数据.
31 写者3401017088暂时不能写入数据
32 读    者3417802496暂时不能读取数据.
33 读    者3426199296暂时不能读取数据.
34 读    者3434592000暂时不能读取数据.

以上是关于读写锁的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁自旋锁读写锁和条件变量

ReentrantReadWriteLock场景应用

读写锁ReentrantReadWriteLock源代码浅析

锁,同步,可重入锁,读写锁(转)

我写的由 GCD 代码支持的读写器锁导致并行测试中的死锁

读写锁(ReadWriteLock)