linux读写锁实现,linux读写锁实现

下面的代码来自开源 sip项目pjsip,觉得实现的很简洁,下次自己要实现的时候可以借鉴,于是就摘录过来了。

该实现不支持同时多个线程写。

//读写锁的实现,值得借鉴

//不支持多个写

struct pj_rwmutex_t

{

pj_mutex_t *read_lock;//实际上是用来保护信号量的

/* write_lock must use semaphore, because write_lock may be released

* by thread other than the thread that acquire the write_lock in the

* first place.

*/

//write_lock必须为信号量,因为释放write_lock的线程不一定就是最初

//获取write_lock的代码位置

/*

互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

基于上面的特点,互斥锁一般用于控制一段临界代码,当然信号量也可以做到。但是如果释放和获取不在一个函数中甚至不在一个线程中时就必须使用信号量了。

*/

pj_sem_t *write_lock;

pj_int32_t reader_count;

};

/*

* Create reader/writer mutex.

*

*/

PJ_DEF(pj_status_t) pj_rwmutex_create(pj_pool_t *pool, const char *name,

pj_rwmutex_t **p_mutex)

{

pj_status_t status;

pj_rwmutex_t *rwmutex;

PJ_ASSERT_RETURN(pool && p_mutex, PJ_EINVAL);

*p_mutex = NULL;

rwmutex = PJ_POOL_ALLOC_T(pool, pj_rwmutex_t);

status = pj_mutex_create_simple(pool, name, &rwmutex ->read_lock);

if (status != PJ_SUCCESS)

return status;

status = pj_sem_create(pool, name, 1, 1, &rwmutex->write_lock);

if (status != PJ_SUCCESS) {

pj_mutex_destroy(rwmutex->read_lock);

return status;

}

rwmutex->reader_count = 0;

*p_mutex = rwmutex;

return PJ_SUCCESS;

}

/*

* Lock the mutex for reading.

*

*/

PJ_DEF(pj_status_t) pj_rwmutex_lock_read(pj_rwmutex_t *mutex)

{

pj_status_t status;

PJ_ASSERT_RETURN(mutex, PJ_EINVAL);

status = pj_mutex_lock(mutex->read_lock);

if (status != PJ_SUCCESS) {

pj_assert(!"This pretty much is unexpected");

return status;

}

mutex->reader_count++;

pj_assert(mutex->reader_count < 0x7FFFFFF0L);

if (mutex->reader_count == 1)

pj_sem_wait(mutex->write_lock);

status = pj_mutex_unlock(mutex->read_lock);

return status;

}

/*

* Lock the mutex for writing.

*

*/

PJ_DEF(pj_status_t) pj_rwmutex_lock_write(pj_rwmutex_t *mutex)

{

PJ_ASSERT_RETURN(mutex, PJ_EINVAL);

return pj_sem_wait(mutex->write_lock);

}

/*

* Release read lock.

*

*/

PJ_DEF(pj_status_t) pj_rwmutex_unlock_read(pj_rwmutex_t *mutex)

{

pj_status_t status;

PJ_ASSERT_RETURN(mutex, PJ_EINVAL);

status = pj_mutex_lock(mutex->read_lock);

if (status != PJ_SUCCESS) {

pj_assert(!"This pretty much is unexpected");

return status;

}

pj_assert(mutex->reader_count >= 1);

--mutex->reader_count;

if (mutex->reader_count == 0)

pj_sem_post(mutex->write_lock);

status = pj_mutex_unlock(mutex->read_lock);

return status;

}

/*

* Release write lock.

*

*/

PJ_DEF(pj_status_t) pj_rwmutex_unlock_write(pj_rwmutex_t *mutex)

{

PJ_ASSERT_RETURN(mutex, PJ_EINVAL);

pj_assert(mutex->reader_count <= 1);

return pj_sem_post(mutex->write_lock);

}

/*

* Destroy reader/writer mutex.

*

*/

PJ_DEF(pj_status_t) pj_rwmutex_destroy(pj_rwmutex_t *mutex)

{

PJ_ASSERT_RETURN(mutex, PJ_EINVAL);

pj_mutex_destroy(mutex->read_lock);

pj_sem_destroy(mutex->write_lock);

return PJ_SUCCESS;

}当然了linux应该针对线程已经有读写锁的实现,不过我觉得彻底搞清楚实现会收获更多,尤其是自己的实际解决问题,可能就需要用到别人好的实现思路。

如果自己要再实现的话,把里面的信号量替换成线程的条件变量即可,实际上条件变量和信号量就是一个概念吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值