用信号量实现读写锁

如何用信号量实现读写锁

方法1

semp.resource = MAX_RESOURCE;

read_lock(semp)
{
    semp.dec(1);
}
~read_lock(semp)
{
    semp.inc(1);
}

write_lock(semp)
{
    semp.dec(MAX_RESOURCE);
}
~write_lock(semp)
{
    semp.inc(MAX_RESOURCE);
}

这种实现有个问题, 写锁可能被饿死, 需要实现写优先.

方法2 

struct rw_lock 
{
    mutex_semp.resource = 1;
    res_semp.resource = MAX_RESOURCE;
};
read_lock(rw_lock)
{
    spin_till(rw_lock.mutex_semp.resource > 0);
    rw_lock.res_semp.dec(1);
}
~read_lock(rw_lock)
{
    rw_lock.res_semp.inc(1);
}
write_lock(rw_lock)
{
    spin_till(rw_lock.mutex_semp.resource > 0);
    rw_lock.mutex_semp.dec(1);
    rw_lock.res_semp.dec(MAX_RESOURCE);
}
~write_lock(rw_lock)
{
    rw_lock.res_semp.inc(MAX_RESOURCE);
    rw_lock.mutex_semp.inc(1);
}
 

需要测试~

 

 

RT-Thread中可以使用信号量实现读写锁,具体实现方式如下所示: ```c /* 定义读写锁结构体 */ typedef struct { rt_sem_t lock; // 读写锁信号量 rt_sem_t write_sem; // 写入信号量 int reader_count; // 读者数量 } rt_rwlock_t; /* 初始化读写锁 */ void rt_rwlock_init(rt_rwlock_t *rwlock) { rwlock->lock = rt_sem_create("rwlock", 1, RT_IPC_FLAG_FIFO); // 初始化为1,表示可用 rwlock->write_sem = rt_sem_create("write_sem", 1, RT_IPC_FLAG_FIFO); rwlock->reader_count = 0; } /* 获取读锁 */ void rt_rwlock_read_lock(rt_rwlock_t *rwlock) { rt_sem_take(rwlock->lock, RT_WAITING_FOREVER); // 加锁,防止其他线程修改reader_count rwlock->reader_count++; if (rwlock->reader_count == 1) { rt_sem_take(rwlock->write_sem, RT_WAITING_FOREVER); // 如果是第一个读者,需要获取写入锁 } rt_sem_release(rwlock->lock); // 解锁 } /* 释放读锁 */ void rt_rwlock_read_unlock(rt_rwlock_t *rwlock) { rt_sem_take(rwlock->lock, RT_WAITING_FOREVER); // 加锁,防止其他线程修改reader_count rwlock->reader_count--; if (rwlock->reader_count == 0) { rt_sem_release(rwlock->write_sem); // 如果没有读者了,释放写入锁 } rt_sem_release(rwlock->lock); // 解锁 } /* 获取写锁 */ void rt_rwlock_write_lock(rt_rwlock_t *rwlock) { rt_sem_take(rwlock->write_sem, RT_WAITING_FOREVER); // 获取写入锁 } /* 释放写锁 */ void rt_rwlock_write_unlock(rt_rwlock_t *rwlock) { rt_sem_release(rwlock->write_sem); // 释放写入锁 } ``` 上述代码中,读写锁结构体包含一个读写锁信号量一个写入信号量一个读者数量。在获取读锁时,需要先获取读写锁信号量,然后增加读者数量,如果是第一个读者,需要获取写入信号量。在释放读锁时,需要先获取读写锁信号量,然后减少读者数量,如果没有读者了,需要释放写入信号量。在获取写锁时,只需要获取写入信号量。在释放写锁时,只需要释放写入信号量。 需要注意的是,在使用读写锁时,需要确保读者和写者之间的互斥性,即不能同时存在读者和写者。因此,在获取写锁时,需要等待所有的读者完成读操作后才能获取锁。这里的实现方式是使用了一个写入信号量实现这个功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值