多线程编程之读写锁

Pthread POSIX threads 的简称,是POSIX线程标准

pthread读写锁把对共享资源的访问者分为读者写者,读者只对共享资源进行读访问,写者只对共享资源进行写操作。在互斥机制,读者和写者都需要独立独占互斥量以独占共享资源,在读写锁机制下,允许同时有多个读者读访问共享资源,只有写者才需要独占资源。相比互斥机制,读写机制由于允许多个读者同时读访问共享资源,进一步提高了多线程的并发度。

1.读写锁机制

写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。

读者:读者使用读锁,如果当前没有写者,读者立即获得读锁;否则读者等待,直到没有写者。

2.读写锁特性

        同一时刻只有一个线程可以获得写锁,同一时刻可以有多个线程获得读锁。

        读写锁处于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。

       读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。

3.读写锁基本函数

# include<pthread.h>

读写锁初始化:

int pthread_rwlock_init(pthread_rwlock_t * rwlock, 

const pthread_rwlockattr_t *  attr);

        该函数第一个参数为读写锁指针,第二个参数为读写锁属性指针。函数按读写锁属性对读写锁进行初始化。

加读锁:

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

        该函数参数为读写锁指针。函数用于对读写锁加读锁。

加写锁:

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

        该函数参数为读写锁指针。函数用于对读写锁加写锁。

释放读写锁:

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

        该函数参数为读写锁指针。函数用于释放读写锁,包括读锁与写锁。

销毁读写锁:

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

        该函数参数为读写锁指针。函数用于销毁读写锁。

4.牛刀小试

        示例使用读写锁,对共享资源data进行读写同步,线程readerMreaderN为读者线程,线程writerAwriterB为写者线程。       

#include "pthread.h"

#include "sched.h"

#include "semaphore.h"

#include "windows.h"

#include "stdio.h"

#pragma comment(lib, "pthreadVC2.lib")     //必须加上这句

pthread_t t1;           //pthread_t变量t1,用于获取线程1的ID

pthread_t t2;           //pthread_t变量t2,用于获取线程2的ID

pthread_rwlock_t rwlock;             //声明读写锁

int data=1;                          //共享资源

void* readerM(void* arg)

{

while(1)

{

pthread_rwlock_rdlock(&rwlock);    //读者加读锁

printf("M 读者读出: %d \n",data);   //读取共享资源

pthread_rwlock_unlock(&rwlock);    //读者释放读锁

Sleep(1200);

}

return NULL;

}

void* readerN(void* arg)

{

while(1)

{

pthread_rwlock_rdlock(&rwlock);

printf(" N读者读出: %d \n",data);

pthread_rwlock_unlock(&rwlock);

Sleep(700);

}

return NULL;

}

void* writerA(void* arg)

{

while(1)

{

pthread_rwlock_wrlock(&rwlock);      //写者加写锁

data++;                              //对共享资源写数据

printf("        A写者写入: %d\n",data);

pthread_rwlock_unlock(&rwlock);      //释放写锁

Sleep(2000);

}

return NULL;

}

void* writerB(void* arg)

{

while(1)

{

pthread_rwlock_wrlock(&rwlock);

data++;

printf("        B写者写入: %d\n",data);

pthread_rwlock_unlock(&rwlock);

Sleep(2000);

}

return NULL;

}

void main(int argc,char** argv)

{

pthread_rwlock_init(&rwlock, NULL);   //初始化读写锁

pthread_create(&t1,NULL,readerM,NULL);

pthread_create(&t1,NULL,readerN,NULL);

pthread_create(&t2,NULL,writerA,NULL);

pthread_create(&t2,NULL,writerB,NULL);

pthread_rwlock_destroy(&rwlock);      //销毁读写锁

Sleep(10000000);

return;

}

result:

来自 <https://blog.csdn.net/lovecodeless/article/details/24968369>

【C/C++多线程编程之九】pthread读写锁相关推荐

  1. Pthread多线程编程之查看Pthread版本的方法

    Pthread多线程编程之查看Pthread版本的方法: getconf GNU_LIBPTHREAD_VERSION [root@localhost Workspace]# getconf GNU_ ...

  2. 【C/C++多线程编程之八】pthread条件变量

    多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程 ...

  3. 【C/C++多线程编程之七】pthread信号量

    多线程编程之信号量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制. 信号量机制用于 ...

  4. 【C/C++多线程编程之六】pthread互斥量

    多线程编程之线程同步互斥量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. Pthread线程同步指多个线程协调地,有序地同步使用共享资源.[C/C++多线程编程之五] ...

  5. 多线程编程之七:pthread条件变量

    ###Date: 2017/11/14 转载自:http://blog.csdn.net/lovecodeless/article/details/24929273  Pthread是 POSIX t ...

  6. 深入浅出多线程编程实战(九)读写锁ReentrantReadWriteLock

    文章目录 前言 一.ReadWriteLock 二.ReentrantReadWriteLock 1.特性 2.使用样例 结尾 前言 在前面的文章中我们介绍过两种锁:内置锁(synchronized) ...

  7. 【C/C++多线程编程之五】pthread线程深入理解

    多线程编程之pthread线程深入理解 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念,在进一步学习线程同步等多线程核心知识之前, ...

  8. 多线程编程核心技术总结(读周志明书籍的总结)

    多线程编程核心技术总结 1.Java多线程基本技能 1.1进程和线程的概念: 进程是独立的程序,线程是在进程中独立运行的子任务. 1.2使用多线程 1.2.1实现方法:继承Thread类,重写Runn ...

  9. java writelock 问题_【转】java并发编程系列之ReadWriteLock读写锁的使用

    前面我们讲解了Lock的使用,下面我们来讲解一下ReadWriteLock锁的使用,顾明思义,读写锁在读的时候,上读锁,在写的时候,上写锁,这样就很巧妙的解决synchronized的一个性能问题:读 ...

最新文章

  1. apt_Word模板注入攻击
  2. 通俗篇:一文搞定矩阵相关概念及意义
  3. DL之ShuffleNetV2:ShuffleNetV2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. 《金色梦乡》金句摘抄(一)
  5. vue项目 一行js代码搞定点击图片放大缩小
  6. 02_感知机_统计学习方法
  7. 如何在SQL Server中使用数据质量服务清除主数据服务数据
  8. ZED2+ORB_SLAM3
  9. 软件工程 第四章 概要设计
  10. DPDK Release 20.08
  11. UE使用EditorUtilityWidget完成简单的编辑器内工具
  12. 立秋是中稻收割的日子
  13. STEPN 新手入门及进阶
  14. 【项目分享】基于AB32和RT-Thread的墨水屏智能日历
  15. html自动关闭当前页面,html如何关闭当前页面
  16. QT中返回和前进的快捷键是什么?VS中ctrl 和 -
  17. FPU、MMX、SSE
  18. Android开发者该学习哪些东西提高竞争力?成功入职腾讯
  19. 操作系统教程课后习题答案完整版
  20. Hexo+buttterfly适合任意主题美化(悬挂动态修饰物)

热门文章

  1. 【日本語学習】 刺身
  2. 几行代码养只猫,心情瞬间好多了
  3. I Hate It (HDU 1754)
  4. Kafka- Spark消费Kafka
  5. 关于未能找到源文件“.NETFramework,Version=v4.0.AssemblyAttributes.cs”问题
  6. java继承覆盖总结
  7. RHEL 6 下VNC Server 的安装配置
  8. Restrict Users to Use Old Passwords
  9. 吴恩达 coursera AI 专项五第三课(下)总结+作业答案
  10. matlab错误:vl_feat工具箱问题