ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

freeswitch APR库线程读写锁

2021-12-09 20:00:27  阅读:208  来源: 互联网

标签:rwlock thread APR 读写 libs apr 线程 read freeswitch


 

 

概述

freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性。

线程读写锁在多线程服务中有重要的作用。对于读数据比写数据频繁的服务,用读写锁代替互斥锁可以提高效率。

由于APR库是跨平台的,而不同平台上的系统接口有区别,所以在APR库中就有一个适配层目录libs\apr\include\arch\,该目录下有不同系统的头文件定义,包括aix、beos、netware、os2、os390、unix、win32。

在编译源代码文件的过程中,根据当前系统自动选择不同的文件目录来适配。

 

下面我们对apr库的线程读写锁实现做一个介绍。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.8.7

GCC:4.8.5

读写锁数据结构

apr库的线程读写锁源代码文件在libs/apr目录下,这里只列出了unix和win32的版本。

libs\apr\include\apr_thread_rwlock.h

libs\apr\include\arch\unix\apr_arch_thread_rwlock.h

libs\apr\locks\unix\thread_rwlock.c

libs\apr\include\arch\win32\apr_arch_thread_rwlock.h

libs\apr\locks\win32\thread_rwlock.c

 

读写锁结构体定义。

我们可以看出,在unix系统下直接使用了pthread线程库的读写锁实现。

libs\apr\include\arch\unix\apr_arch_thread_rwlock.h

struct apr_thread_rwlock_t {

    apr_pool_t *pool;

    pthread_rwlock_t rwlock;

};

 

在win32系统则是使用了临界区CRITICAL_SECTION、mutex和event协同实现。

libs\apr\include\arch\win32\apr_arch_thread_rwlock.h

struct apr_thread_rwlock_t {

    apr_pool_t *pool;

    HANDLE      write_mutex;

    HANDLE      read_event;

    LONG        readers;

       CRITICAL_SECTION  read_section;

};

 

常用函数

查看源代码头文件libs\apr\include\apr_thread_rwlock.h。

apr_thread_rwlock_create           //创建并初始化1个线程读写锁

apr_thread_rwlock_rdlock           //获取1个共享读锁

apr_thread_rwlock_tryrdlock       //非阻塞获取1个共享读锁

apr_thread_rwlock_wrlock          //获取1个独占写锁

apr_thread_rwlock_trywrlock      //非阻塞获取1个独占写锁

apr_thread_rwlock_unlock          //解锁1个读写锁

apr_thread_rwlock_destroy         //销毁读写锁

 

从接口定义我们可以看出,加读锁和加写锁是分开的接口,而解锁是同一个接口。

 

接口的实现我们简单介绍一下。

在unix系统下,读写锁的接口中直接调用了pthread库中对应的读写锁接口。

比如apr_thread_rwlock_create中调用了pthread_rwlock_init,apr_thread_rwlock_rdlock中调用了pthread_rwlock_rdlock等等,这里就不再详细展开了,有兴趣的可以自己查看一下pthread_rwlock_t读写锁的定义和实现。

 

在win32系统下,读写锁的接口中使用了readers、read_event、write_mutex和read_section几个变量共同实现了读写锁的功能。

伪代码-读锁(读写锁, 超时时间)

       进入临界区read_section

       等待信号write_mutex,失败或超时则返回错误

       计数器readers+1

       重置事件read_event,失败则返回错误

       释放write_mutex,失败则返回错误

       离开临界区read_section

       返回成功

 

伪代码-写锁(读写锁, 超时时间)

       等待信号write_mutex,失败或超时则返回错误

       等待信号read_event,失败或超时则释放write_mutex,并返回错误

       返回成功

 

伪代码-解锁(读写锁)

       释放write_mutex

       计数器readers-1

       设置事件read_event

       返回

 

说实话。。。win32的代码我没看懂,有没有win开发的高手给讲解一下。

比如,为什么只有读锁中有临界区read_section的操作,为什么write_mutex只有释放操作,为什么写锁中没有等待readers为0。。。

总结

apr库的线程读写锁的实现介绍完了。

读写锁的适用场景是多线程下读多写少的业务流程,以实现独占写和共享读的逻辑。

在合适的场景中,读写锁比互斥锁有更高的并发能力和效率。

另外,还有强读者和强写者俩种不同的形式,读者可以自己深入研究一下。

 

 


 

空空如常

求真得真

 

标签:rwlock,thread,APR,读写,libs,apr,线程,read,freeswitch
来源: https://www.cnblogs.com/qiuzhendezhen/p/15669036.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有