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结构 ...
随机推荐
- 浅谈HookSSDT和和Resume(恢复)SSDT
最近在学HookSSDT和针对Hook的ResumeSSDT,避免自己理解有所偏差,把它们写出来,希望大家不吝赐教.(虽然已经是过时了的技术,但是最起码了解其中的原理,嘿嘿嘿.) 转载注明出处:ht ...
- 作列表排列时div的table属性应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- GitHub 上受欢迎的 Android UI Library 整理二
通知 https://github.com/Tapadoo/Alerter ★2528 - 克服Toast和Snackbar的限制https://github.com/wenmingvs/Notify ...
- 蚂蚁金服CTO程立:金融级分布式交易的技术路径
总结: 强一致的微服务 oceanbase里面的投票选举以及多中心多地部署 单元化市异地多活的基础.支付宝是异地多活和容灾结合,而容灾的基础也是单元化.基于单元化进行单元的调度.部署.容灾. 混合云架 ...
- Xamarin.Forms的相对布局RelativeLayout
Xamarin.Forms的相对布局RelativeLayout 相对布局RelativeLayout是App中常用的布局方式.它是以界面中的某个元素为基准,设置另外一个元素的位置和大小.通过这种 ...
- Linux下批量替换文件内容和文件名(转)
1.批量替换指定多个文件的文件内容 在指定目录/your/path里,查找包含old_string字符串的所有文件,并用new_string字符串替换old_string字符串. sed -i &qu ...
- 邁向IT專家成功之路的三十則鐵律 鐵律十三:IT人理財之道-知足
身為一位專業的IT人士,工作上不僅要做到滿足興趣與專業熱忱,當然也要做到能夠滿足荷包.現代人賺錢不是問題,但花錢卻出了很大問題,親愛的IT朋友們,請不要將您辛苦賺來的錢花在想要的東西上,實際上需要的卻 ...
- android toolbar 假标题居中
<android.support.v7.widget.Toolbar android:id="@+id/toolbar_top" android:layout_height= ...
- iOS开发 CGBitmapContextCreate
最近项目中,需要对图片进行各种操作. 使用CGBitmapContextCreate 创建位图上下文. CG_EXTERN CGContextRefCGBitmapContextCreate(void ...
- iOS开发 编码规范
转至 http://www.cnblogs.com/celestial/archive/2012/06/30/2571417.html 编码规范 一.文档结构管理 1.建立Libraries文件夹 ...