Linux线程同步之读写锁

摘要:
1.特点:一次只有一个线程可以在读写模式下保持读写锁,但多个线程可以同时在读写状态下保持读读锁。由于这一特性,当读写锁处于写锁状态时,所有试图锁定锁的线程都将在解锁锁之前被阻止。当读写锁处于读锁定状态时,所有试图将其锁定在读写模式的线程都可以获得访问权限。但是,如果一个线程想要将锁锁定在写模式,它必须阻止,直到所有线程释放锁。通常,当读写锁处于读模式锁定状态时,如果另一个线程试图以写模式锁定锁

1. 特性:

    一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,

  • 当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.
  • 当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须阻塞知道所有的线程释放锁.
  • 通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞.

2. 适用性:

    读写锁适合于对数据结构的读次数比写次数多得多的情况. 因为, 读模式锁定时可以共享, 以写模式锁住时意味着独占, 所以读写锁又叫共享-独占锁.

3. 初始化和销毁:

Linux线程同步之读写锁第1张#include <pthread.h>
Linux线程同步之读写锁第1张
Linux线程同步之读写锁第1张int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
Linux线程同步之读写锁第1张int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
Linux线程同步之读写锁第1张
Linux线程同步之读写锁第1张成功则返回0, 出错则返回错误编号.

同互斥量以上, 在释放读写锁占用的内存之前, 需要先通过pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.

4. 读和写:

Linux线程同步之读写锁第1张#include <pthread.h>
Linux线程同步之读写锁第1张
Linux线程同步之读写锁第1张int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
Linux线程同步之读写锁第1张int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
Linux线程同步之读写锁第1张int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

Linux线程同步之读写锁第1张
Linux线程同步之读写锁第1张成功则返回0, 出错则返回错误编号.

  这3个函数分别实现获取读锁, 获取写锁和释放锁的操作. 获取锁的两个函数是阻塞操作, 同样, 非阻塞的函数为:

Linux线程同步之读写锁第1张#include <pthread.h>
Linux线程同步之读写锁第1张
Linux线程同步之读写锁第1张int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
Linux线程同步之读写锁第1张int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
Linux线程同步之读写锁第1张
Linux线程同步之读写锁第1张成功则返回0, 出错则返回错误编号.

非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY.

5. 属性设置

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

     int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrictpshared);
    int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,int pshared);

   pthread_rwlockattr_setkind_np (attr, pref)

参考:http://blog.csdn.net/dai_weitao/archive/2007/08/21/1752843.aspx

免责声明:文章转载自《Linux线程同步之读写锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇获取进程以及父进程的pid 验证进程之间的数据隔离 join方法 进程对象的其他属性 僵尸进程与孤儿进程(存在Linux系统中) 守护进程Spring Boot的面试题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

开源微内核seL4

微内核 越大的系统潜在的bug就越多。所以微内核在降低bug方面非常有优势,seL4是世界上最小的内核之中的一个。可是seL4的性能能够与当今性能最好的微内核相比。 作为微内核,seL4为应用程序提供少量的服务。如创建和管理虚拟内存地址空间的抽象,线程和进程间通信IPC。这么少的服务靠8700行C代码搞定。seL4是高性能的L4微内核家族的新产物,它具...

服务CPU 100%排查思路

出处: https://www.cnblogs.com/dennyzhangdd/p/11585971.html 一、引子   对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高。 二、问题复现   线上系统突然运行缓慢,CPU飙升,甚至到100%...

jdk线程的简单使用

一、线程的实现方式方式一:继承Thread类一个类只要继承了Thread类,并重写run()方法,则就可以实现多线程的操作。 public class ThreadDemo01 { public static void main(String[] args) { Thread1 thread1 = new Thread1("thr...

Linux获取线程tid线程名

Linux获取线程tid线程名 1 2 3 4 5 6 //thread name char cThreadName[32] = {0}; prctl(PR_GET_NAME, (unsigned long)chThreadName); //tid syscall(SYS_gettid)...

java线程管理

java线程管理 参见: http://harmony.apache.org/subcomponents/drlvm/TM.html 1. 修订历史 2. 关于本文档 2.1. 目的 2.2. 面向的读者 2.3. 文档约定 2.4. 文档使用 3. 概览 3.1. 主要特点 3.2. VM中的线程管理器 3.3. 可移植性 4. 体系结构...

async await与async await Task.Run

普通的async await方法其实是一个同步的异步调用,此方式并不开启新的线程,只是一个多任务处理模式,只是主线程在运行时不会阻塞卡死。此方式只能调用异步方法。 (使用async和await定义异步方法不会创建新线程,所以使用Thread.Sleep(3000)主线程也会阻塞卡死) (由于不是开始新线程,所以在方法内页面的所有控件都可以直接访问) 而as...