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结构 ...
随机推荐
- git 中遇到的问题
刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...
- 使用iframe实现提交表单不刷新页面
正常情况下,当你向服务器发送数据的时候,你的浏览器将会打开action页面,并且不会重回到当前页面.但是有的时候,我们因为各种各样的要求,而不希望浏览器在提交数据的时候去刷新当前的页面或者转向到新的页 ...
- FMDB使用Cached Statement功能
FMDB使用Cached Statement功能 在FMDB中,Cached Statement功能是一种提高SQLite数据库访问的技术.在SQLite中,所有的SQL语句都会被编译,形成预处理 ...
- iOS -- SKTextureAtlas类
SKTextureAtlas类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架 /System/Library/Frameworks/SpriteKi ...
- 前端模板inspinia
前端模板,可以下个免费的,可以花点小钱买.或者github搜索一个 https://chuibility.github.io/inspinia/ http://cn.inspinia.cn/layou ...
- Node之父ry发布新项目deno:下一代Node
https://mp.weixin.qq.com/s/1LcO3EqGV2iRlZ1aIrQeqw
- 手机遥控器,3.5mm耳机接口红外遥控改造解析
很多家电都用红外遥控,如电视机.机顶盒.空调.电风扇等.越来越多的遥控器反而给我们带来了更多的问题,有时找不到遥控器放哪儿了,或者混淆了都是麻烦,事实上对手机进行简单的改造,可以自制一个万能红外遥控器 ...
- 安装 - LNMP一键安装包
https://lnmp.org/ 系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存( ...
- 百科知识 .tar.xz文件如何打开
7-ZIP可以打开,右击提取到当前目录即可 发现这个压缩比例还是相当不一般的,都快十倍了.
- 怎样制作gif图片?怎样制作你项目的动态效果图到你的csdn?
怎样制作gif图?怎样上传你项目的动态效果图到你的csdn? 这仅仅是笔者用的方法.有其它方法的欢迎分享. 一张或几张展示了你的项目的功能及效果的动态图放在博客文章开头会为你的文章润色不少. 相信非常 ...