读写锁的分配规则:

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,出错返回为正的Exxx值

读写锁属性

静态分配的读写锁可通过给它赋常值PTHREAD_RWLOCK_INITIALIZER来初始化。读写锁变量也可以通过调用pthread_rwlock_init动态的初始化。当一个线程不再需要某个读写锁时,它可以调用pthread_rwlock_destroy销毁

#include <pthread.h>

int pthread_rwlock_init(pthread_rwlock_t *rwptr, pthread_rwlockattr_t *attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwptr);

成功返回 0,失败返回为正的Exxx值

初始化某个读写锁时,如果attr是个空指针,那就使用缺省属性。要赋予它非缺省的属性,需使用下列两个函数

#include <pthread.h>
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

成功返回 0,失败返回为正的Exxx值

数据类型为pthread_rwlockattr_t的某个属性对象一旦初始化,使能或禁止特定属性就通过调用 不同的函数来完成。当前定义了的唯一属性是PTHREAD_PROCESS_SHARED,它指定相应的读写锁将在不同进程间共享,而不仅仅是在单个进程内的不两只线程间共享。

#include <pthread.h>
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *valptr);

int phread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int value);

成功返回 0,出错返回为正的Exxx值

第一个函数在由valptr指向的整数中返回该属性的当前值。第二个函数把该属性的当前值设置为value,其值或为PTHREAD_PROCESS_PRIVATE或为PTHREAD_PROCESS_SHARED

线程取消

#include <pthread.h>

int pthread_cancel(pthread_t tid);

成功返回0,失败返回为正的Exxx值

适用情况:如果启动了多个线程以执行某个给定任务,那么首先完成任务的线程可使用线程取消功能取消其它线程。另一个例子是,当多个线程开始执行同一个任务时,如果其中一个线程发现一个错误,它和其它线程诮必要终止。

为处理被取消的可能情况,任何线程可以压入和弹出清理处理程序

#include <pthread.h>

void pthread_cleanup_push(void (*function)(void *), void *arg);

void pthread_cleanup_pop(int execute);

处理程序在以下情况时被调用:

1、调用线程被取消(由某个线程调用 pthread_cancel完成)

2、调用线程自愿终止(调用pthread_exit,或从自己的线程起始函数返回)

进程通信学习笔记(读写锁)相关推荐

  1. linux一个进程通知另外一个进程,Linux进程通信学习笔记

    一.为什么需要进程通信 1)数据传输 一个进程需要把它的数据发送给另一个进程. 2)资源共享 多个进程之间共享同样的资源. 3)通知事件 一个进程向另外一个进程发送消息,通知它发生了某事件. 4)进程 ...

  2. 进程通信学习笔记(System V消息队列)

    跟Posix消息队列一样,不存在这样的要求:某个进程往一个队列中写入一个消息,另外一个进程下在等待该队列上一个消息的到达 系统中的消息队列,定义在<sys/msg.h>头文件中的信息结构: ...

  3. 进程通信学习笔记(管道)

    1.管道 pipe函数创建单向数据流 #include <unistd.h> int pipe(int fd[2]); 成功返回0,失败返回-1 该函数返回两个文件描述字:fd[0]和fd ...

  4. 进程通信学习笔记(记录上锁)

    Posix fcntl记录上锁 记录上锁的Posix接口是fcntl函数 #include <fcntl.h> int fcntl(int fd, int cmd, .../* struc ...

  5. 进程通信学习笔记(互斥锁和条件变量)

    1.互斥锁:上锁和解锁 Posix互斥锁作为数据类型pthread_mutex_t的变量声明.如果互斥锁变量是静态分配的,那么可以把它初始化成常值PTHREAD_MUTEX_INITIALIZER.如 ...

  6. 进程通信学习笔记(Posix消息队列)

    在某个进程往一个队列写入消息之前,并不需要另外有个进程在该队列上等待消息的到达,这跟管道和FIFO是相反的,对于后两者来说,除非读出者已存在,否则先有写入者是没有意义的 1.mq_open.mq_cl ...

  7. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  8. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

  9. CAN总线通信学习笔记

    CAN总线通信学习笔记 完整笔记链接:https://mubu.com/doc/67Rn6yaozhS CAN总线笔记目录 定义 底层原理 CAN信号传输 发送 接收 CAN总线结构.特点.分类 CA ...

最新文章

  1. Udacity机器人软件工程师课程笔记(三)-样本搜索和找回-基于漫游者号模拟器-使用moviepy输出测试视频
  2. 惠普z640服务器装系统,顾问文档: HP Z440、Z640 和 Z840 工作站 - 在采用 Broadwell 处理器的系统上安装 HP ZTurbo Quad Pro 后,出现黑屏...
  3. 数据库视频总结一(概述)
  4. Android自定义Shape
  5. Django中使用ajax技术概述
  6. vue部署到服务器_利用Gulp实现代码自动化部署
  7. 8. 吴恩达机器学习课程-作业8-异常检测和推荐系统
  8. 计算机三级数据库技术 知识点
  9. 数字信号处理---模拟信号数字处理方法
  10. 学习使用php实现公历农历转换的方法代码
  11. java扫雷初级代码_运行在Eclipse环境下的java扫雷游戏的初级代码是什么?
  12. 烤星 DeFi 课堂 | 去中心化交易所适合小白用吗?
  13. STM32(八)W25Q(16/32/64/128)芯片学习总结
  14. 计算机数字顺序怎么带公式,Excel函数公式:6个数据排序技巧,总有一个适合你!...
  15. 数字图像处理(9): 图像缩放、图像旋转、图像翻转 和 图像平移
  16. 咪咕音乐的下载音乐存储路径(MAC)
  17. 【028】仿猫眼、淘票票的电影后台管理和售票系统系统(含后台管理)(含源码、数据库、运行教程)
  18. 百度开发平台api有哪些
  19. 中国空气能热水器市场品牌竞争格局与投资价值分析报告2022版
  20. 索尼z5android 7.1,真良心!索尼Xperia Z3+系列升至Android 7.0

热门文章

  1. 输入带空格字符串的两种方法
  2. svn检出图标不会发生改变_SVN系列操作(二)svn不显示图标的解决方法
  3. python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...
  4. python安装教程3.8.5-怎么安装最新Python3.8.5-新手入门教程必看
  5. 全部python编程语言-编程语言高质量代码的优秀Python工具
  6. python月薪是多少-2019年 Python就业市场行情好不好, 薪资多少?
  7. python在中国的发展-Python未来的发展前景到底如何?
  8. python是人工智能最大骗局-Python与人工智能的关系原来是这样的...
  9. python数字类型-Python数字类型介绍
  10. python与php8-python和php对比