Linux环境编程之同步(三):读写锁
概述
相互排斥锁把试图进入我们称之为临界区的全部其它线程都堵塞住。该临界区通常涉及对由这些线程共享一个或多个数据的訪问或更新。读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作差别。
读写锁的分配规则例如以下:
1、仅仅要没有线程持有某个给定的读写锁用于写。那么随意数目的线程能够持有该读写锁用于读。
2、仅当没有线程持有某个给定的读写锁用于读或用于写时,才干分配该读写锁用于写。
即仅仅要没有线程在改动某个给定的数据,那么随意数目的线程都能够拥有该数据的读訪问权。仅当没有其它线程在读或改动某个给定的数据时。当前线程才干够改动它。
这样的对于某个给定资源的共享訪问也称为共享-独占上锁,由于获取一个读写锁用于读称为共享锁。获取一个读写锁用于写称为独占锁。
获取与释放读写锁
读写锁的数据类型为pthread_rwlock_t。假设这个类型的某个变量是静态分配的。则可通过给它赋常值PTHREAD_RWLOCK_INITIALIZER来初始化它。
pthread_rwlock_rdlock获取一个读出锁。假设相应的读写锁已由某个写入者持有。那就堵塞调用线程。pthread_rwlock_wrlock获取一个写入锁,假设相应的读写锁已由还有一个写入者持有,或者已由一个或多个读出者持有,那就堵塞调用线程。pthread_rwlock_unlock释放一个读出锁或写入锁。
#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_unlock(pthread_rwlock_t *rwptr); //成功返回0,出错返回为正的EXXX值。
以下两个函数尝试获取一个读出锁或写入锁。但假设该锁不能立即取得,那就返回一个EBUSY错误,而不是调用线程投入睡眠。
#include <pthread.h>
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwptr); //成功返回0,出错返回正值
读写锁属性
给静态分配的读写锁赋值PTHREAD_RWLOCK_INITIALIZER来初始化它。
读写锁变量也可通过调用pthread_rwlock_init来动态地初始化。
当当一个线程不再须要某个读写锁时。可调用pthread_rwlock_destroy摧毁它。
#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *rwptr, const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwptr); //成功为0,出错为正值
初始化某个读写锁时,假设attr是空指针。就使用默认属性。
要赋予它非默认的属性,须要使用例如以下两个函数:
#include <pthread.h>
int pthread_rwlockattr_init(pthread_rwlockattr_t *rwptr);
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *rwptr); //成功为0,出错为正值
数据类型为pthread_rwlockattr_t的某个属性对象一旦初始化。就通过调用不同的函数来启用或禁止特定属性。
当前定义了的唯一属性是PTHREAD_PROCESS_SHARED,它指定相应的读写锁将不同进程间共享,而不仅仅是在单个进程内的不同线程间共享。以下两个函数分别获取和设置这个属性。
#include <pthread.h>
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *valptr);
int pthread_rwlockattr_setpshared(const pthread_rwlockattr_t *attr, int value); //成功返回0,出错返回正值
读写锁的实现可參考《UNP2》P142
Linux环境编程之同步(三):读写锁的更多相关文章
- UNIX环境高级编程——线程同步之读写锁以及属性
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...
- Linux环境编程之同步(四):Posix信号量
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语.有三种类型:Posix有名信号量,使用Posix IPC名字标识.Posix基于内存的信号量,存放在共享内存区中:System ...
- Linux环境编程之同步(二):条件变量
相互排斥锁用于上锁,条件变量则用于等待.条件变量是类型为pthread_cond_t的变量.一般使用例如以下函数: #include <pthread.h> int pthread_con ...
- Linux线程同步之读写锁(rwlock)
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 和 ...
- Linux环境编程相关的文章
Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...
- linux线程同步(3)-读写锁
一.概述 读写锁与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区, ...
- linux线程间同步(1)读写锁
读写锁比mutex有更高的适用性,能够多个线程同一时候占用读模式的读写锁.可是仅仅能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,全部试图对这个锁加锁的线程都会被堵塞 ...
- linux系统编程--线程同步
同步概念 所谓同步,即同时起步,协调一致.不同的对象,对“同步”的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步,是指让两个或多个数据库内容保持一致,或者按需 ...
- Linux c编程:同步属性
就像线程具有属性一样,线程的同步对象(如互斥量.读写锁.条件变量.自旋锁和屏障)也有属性 1.互斥量属性 用pthread_mutexattr_init初始化pthread_mutexattr_t结构 ...
随机推荐
- Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)
需求如题. 在Android4.2.2中,导航栏(也就是屏幕底部的三个按钮,home,back,recentapp)是系统应用SystemUi.apk的一部分,简言之,我们的需求就是让我们的app来控 ...
- [转]常用iOS图片处理方法
自:http://blog.sina.com.cn/s/blog_8988732e0100xcx1.html ========== (one) UIImage 图像 等比例缩放=========== ...
- UVA - 10050 Hartals
#include <cstdio> #include <cstring> ]; ]; int main() { int t; scanf("%d", &am ...
- iphoneXR的tabbar底部图片的适配
在自定义tabbar的背景图时,发现在ihonexr上有点问题,主要是因为iphoneXr用的是二倍图,但是Xr的tabbar底部高度多了34像素,所以就出现了如下的情况: 解决这个问题,还比较简单, ...
- jq 全选、反选、判断选中的条数
1.全选或全不选.当勾选全选按钮#selectAll旁边的复选框#all时,列表中的选项全部选中,反之取消勾选则列表中的选项全部为未选中状态. $("#all").click(fu ...
- Codeforces 149D Coloring Brackets(树型DP)
题目链接 Coloring Brackets 考虑树型DP.(我参考了Q巨的代码还是略不理解……) 首先在序列的最外面加一对括号.预处理出DFS树. 每个点有9中状态.假设0位不涂色,1为涂红色,2为 ...
- 网络入侵检测规避工具fragrouter
网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包.对于传输较大的数据包,通常会采用分片的方式,将大数据包拆分为小数据包进行传输.如果入 ...
- Nginx+keepalived双机热备(主从模式)
简单介绍: Keepalived是Linux下面实现VRRP备份路由的高可靠性运行软件,能够真正做到 主服务器和备份服务器故障时IP瞬间无缝交接; Keepalived的目的是模拟路由器的高可用; H ...
- mybatis 源码学习(一)配置文件初始化
mybatis是项目中常用到的持久层框架,今天我们学习下mybatis,随便找一个例子可以看到通过读取配置文件建立SqlSessionFactory,然后在build拿到关键的sqlsession,这 ...
- 321. Create Maximum Number
/* * 321. Create Maximum Number * 2016-7-6 by Mingyang */ public int[] maxNumber(int[] nums1, int[] ...