使用读写锁实现线程同步
程序员文章站
2022-06-06 11:46:08
简介: 读写锁与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁特性: 1. 读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。 2. 读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功。如果线程以写模式加锁会阻塞。 3. 读写锁是“读模式加锁”时,如果 ......
简介:
读写锁与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。
读写锁特性:
读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。
读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功。如果线程以写模式加锁会阻塞。
-
读写锁是“读模式加锁”时,如果有另外线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求长期阻塞;
读写锁非常适合于对数据结构读的次数远大于写的情况。
应用实例:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> pthread_rwlock_t rwlock; void *pthread_one(void *arg) { /* 分别测试先上写锁和先上读锁的情况 */ //pthread_rwlock_wrlock(&rwlock); pthread_rwlock_rdlock(&rwlock); //puts("wrlock locked first, pthread one!"); puts("rdlock locked first, pthread one!"); sleep(2); puts("after sleep 2s"); pthread_rwlock_unlock(&rwlock); } void *pthread_two(void *arg) { pthread_rwlock_rdlock(&rwlock); puts("got the rdlock, pthread two!"); } int main() { int i = 0; pthread_t id[2]; /* 读写锁初始化 */ pthread_rwlock_init(&rwlock, null); pthread_create(&id[0], null, pthread_one, null); sleep(1); pthread_create(&id[1], null, pthread_two, null); for(; i<2; i++) pthread_join(id[i], null); /* 销毁读写锁 */ pthread_rwlock_destroy(&rwlock); return 0; }
运行结果(两种情况):
参考自:www.aliyun.com/jiaocheng/143521.html
上一篇: 团队项目合作探索系列二 开发模式
下一篇: 课堂纪律
推荐阅读
-
使用GoldenGate 实现Oracle for Oracle 单向数据同步
-
使用PHP实现Mysql读写分离_PHP
-
Java使用三种方法实现高并发锁的示例代码
-
VUE:使用async和await实现axios同步请求
-
vue中使用async、await和promise实现异步API的同步调用
-
使用 async 和 await,实现 fetch 同步请求
-
vue 使用 async 和 await 实现异步 axios 同步化(实战案例:数据异步校验通过后,再执行保存)
-
android使用AsyncTask实现多线程下载实例
-
微信小程序 ———— 异步请求中使用async/await实现同步请求
-
详解iOS 多线程 锁 互斥 同步