5 rt-thread posix读写锁源码分析

本文对POSIX读写锁源码进行分析,涵盖初始化、销毁、阻塞与非阻塞读锁定等操作。初始化涉及互斥锁、条件变量等;销毁需检查状态并释放信号;阻塞读锁定要处理写入者、等待锁数量等情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

posix读写锁源码分析

初始化读写锁

int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
{
    if (!rwlock)
        return EINVAL;
    rwlock->attr = PTHREAD_PROCESS_PRIVATE;                     ///> (1)
    pthread_mutex_init(&(rwlock->rw_mutex), NULL);              ///> (2)
    pthread_cond_init(&(rwlock->rw_condreaders), NULL);         ///> (3)
    pthread_cond_init(&(rwlock->rw_condwriters), NULL);         ///> (4)
    rwlock->rw_nwaitwriters = 0;                                ///> (5)
    rwlock->rw_nwaitreaders = 0;                                ///> (6)
    rwlock->rw_refcount = 0;                                    ///> (7)
    return 0;
}

代码段(1):仅有那些由同一个进程创建的线程才能够处理该读写锁。
代码段(2):初始化互斥锁。
代码段(3):初始化读条件变量。
代码段(4):初始化写条件变量。
代码段(5):等待的写线程的数量。
代码段(6):等待的读线程的数量。
代码段(7):0: 解锁; -1: 写入者上锁; > 0 n 读者上锁

销毁读写锁

int pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
{
    int result;
    if (!rwlock)
        return EINVAL;
    if (rwlock->attr == -1)                                                 
        return 0; /* rwlock is not initialized */                           ///> (1)
    if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)             ///> (2)
        return(result);
    if (rwlock->rw_refcount != 0 || rwlock->rw_nwaitreaders != 0 ||         ///> (3)
                                        rwlock->rw_nwaitwriters != 0)
    {
        result = EBUSY;
        return result;
    }
    else
    {
        /* check whether busy */
        result = zs_sem_trytake(&(rwlock->rw_condreaders.sem));             ///> (4)
        if (result == ZS_EOK)
        {
            result = zs_sem_trytake(&(rwlock->rw_condwriters.sem));         ///> (5)
            if (result == ZS_EOK)
            {
                zs_sem_release(&(rwlock->rw_condreaders.sem));              ///> (6)
                zs_sem_release(&(rwlock->rw_condwriters.sem));              ///> (7)
                pthread_cond_destroy(&rwlock->rw_condreaders);              ///> (8)
                pthread_cond_destroy(&rwlock->rw_condwriters);              ///> (9)
            }
            else
            {
                zs_sem_release(&(rwlock->rw_condreaders.sem));              ///> (10)
                result = EBUSY;
            }
        }
        else
            result = EBUSY;
    }
    pthread_mutex_unlock(&rwlock->rw_mutex);                                ///> (11)
    if (result == 0)
        pthread_mutex_destroy(&rwlock->rw_mutex);                           ///> (12)
    return result;
}

代码段(1):读写锁没有初始化。
代码段(2):互斥锁上锁。
代码段(3):写入者或读者上锁;存在等待的读线程数量;存在等待的写线程数量。
代码段(4):非阻塞方式获取读信号。
代码段(5):非阻塞方式获取写信号。
代码段(6):释放读信号。
代码段(7):释放写信号。
代码段(8):释放读写锁读操作。
代码段(9):释放读写锁写操作。
代码段(10):释放读写锁读操作。
代码段(11):互斥锁解锁。
代码段(12):销毁互斥锁。

阻塞方式对读写锁读锁定

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
{
    int result;
    if (!rwlock)
        return EINVAL;
    if (rwlock->attr == -1)
        pthread_rwlock_init(rwlock, NULL);                              ///> (1)
    if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)          ///> (2)
        return(result);
    /* give preference to waiting writers */
    while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)      ///> (3)
    {
        rwlock->rw_nwaitreaders++;                                      ///> (4)
        /* rw_mutex will be released when waiting for rw_condreaders */
        result = pthread_cond_wait(&rwlock->rw_condreaders, &rwlock->rw_mutex); ///> (5)
        /* rw_mutex should have been taken again when returned from waiting */
        rwlock->rw_nwaitreaders--;                                              ///> (6)
        if (result != 0) /* wait error */
            break;
    }
    /* another reader has a read lock */
    if (result == 0)
        rwlock->rw_refcount++;                                          ///> (7)        
    pthread_mutex_unlock(&rwlock->rw_mutex);                            ///> (8)
    return (result);
}

代码段(1):初始化读写锁。
代码段(2):互斥锁上锁。
代码段(3):写入者上锁;存在等待的写入锁;
代码段(4):等待的读锁数量加一;
代码段(5):阻塞方式获取读写锁的读操作释放;
代码段(6):等待的读锁数量减一;
代码段(7):读者加一;
代码段(8):互斥锁解锁;

非阻塞方式对读写锁读锁定

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
{
    int result;
    if (!rwlock)
        return EINVAL;
    if (rwlock->attr == -1)
        pthread_rwlock_init(rwlock, NULL);
    if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
        return(result);
    if (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)
        result = EBUSY;        /* held by a writer or waiting writers */
    else
        rwlock->rw_refcount++; /* increment count of reader locks */
    pthread_mutex_unlock(&rwlock->rw_mutex);
    return(result);
}
### RT-ThreadPOSIX线程的关系及差异 #### 1. 定义与标准遵循 RT-Thread 是一个开源的实时操作系统(RTOS),适用于各种微控制器(MCU)平台,提供了一个紧凑且高效的内核来管理任务调度、同步机制和其他系统服务[^5]。相比之下,POSIX Threads(通常称为pthread)是一组由IEEE定义的标准API接口集合,用于编写多线程程序;这些API被广泛应用于类Unix操作系统中,如Linux和macOS。 #### 2. 资源消耗 由于设计目标不同,在资源占用方面两者存在显著区别。RT-Thread旨在最小化内存使用并优化性能以适应嵌入式设备的需求,因此其核心组件非常精简,并提供了灵活配置选项以便开发者裁剪不必要的特性[^6]。而POSIX线程模型相对较为复杂,它依赖宿主机操作系统的全面支持,这使得每个线程可能需要更多的上下文信息保存空间以及更复杂的初始化过程[^7]。 #### 3. 实时性保障 对于硬实时应用来说,RT-Thread具有明显优势因为它专门针对此类需求进行了优化处理——例如通过优先级继承协议防止优先级反转现象的发生从而确保高优先生命周期内的及时响应[^8]。然而,尽管某些版本的操作系统实现了改进措施试图提高兼容模式下的表现力,但在默认情况下大多数通用目的型桌面或服务器端平台上运行的POSIX线程并不能完全满足严格的时限要求[^9]。 #### 4. 编程接口风格 在编程体验上也有所差别:RT-Thread采用C语言作为主要开发工具,并围绕着一套简洁直观的任务控制函数构建起整个框架体系结构[^10]; ```c rt_thread_t tid; tid = rt_thread_create("thread", entry, parameter, stack_size, priority, tick); if(tid != RT_NULL){ rt_thread_startup(tid); } ``` 另一方面,POSIX线程库则基于ANSI C/C++标准扩展而来,不仅涵盖了基本的功能调用而且还引入了一些高级特性比如条件变量、读写锁等用来简化并发编程难度[^11]。 ```c #include <pthread.h> void* thread_func(void *arg){ // Thread code here... } int main(){ pthread_t thd; pthread_create(&thd,NULL,thread_func,(void*)NULL); ... } ``` #### 5. 应用场景 鉴于上述特点,RT-Thread更适合部署于那些对成本敏感并且计算能力有限的小型硬件环境中,特别是物联网(IoT)节点、智能家居产品等领域;而对于大型分布式系统或者高性能科学计算集群而言,则往往倾向于选用具备更好移植性和社区生态支持度的POSIX线程解决方案[^12]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值