ACE的读写锁

该博客详细探讨了ACE库中读写锁的使用,通过代码展示了在等待写者或存在等待写者时,读锁如何进行条件等待以及在错误发生时如何释放互斥锁。

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

       ACE定义了四个宏:ACE_WRITE_GUARDACE_WRITE_GUARD_RETURNACE_READ_GUARDACE_READ_GUARD_RETURN。这四个宏的目的是为了实现高效的读写机制。其实就是定义两种对象:ACE_Read_GuardACE_Write_Guard。这两个类的意义在于在构造的时候,自动对应类型的锁,在析构的时候释放。为了保证高效率,如何构造读写锁就比较重要。比如说,使用ACE_Thread_Mutex的时候,虽然它也支持读写锁的接口,但是这并不是最好的选择,因为对于它来说,读写的加锁方式是完全一样的。所以说,如果用ACE_Thread_Mutex来实现读写锁的话,和普通加锁是没有区别的。
       在这里,先还想讨论一下,为什么要加读写锁,读写锁和互斥锁相比的优势又是在什么地方。在看实现的时候,读写锁内部是存在互斥锁的,这些互斥锁为了保护结构的修改。读写锁的意义在于,如果操作是个费时操作,那么读写锁的优势就能够体现了。优势在于读的同时不影响别的读操作。但是如果操作是不费时的,读写锁就没有意义了。
       那么再说一下读写锁的实现,对于进程范围来说是使用ACE_RW_Thread_Mutex是比较好的选择。对于Win32来说,使用的是WaitForSingleObject,而对于Posix来说,本来就有读写锁的设置。那么仅仅对win32来说,读写到底有什么不同。看看实现的代码,
写锁:while (rw->ref_count_ != 0)
        {
          rw->num_waiting_writers_++;
 

          if (ACE_OS::cond_wait (&rw->waiting_writers_, &rw->lock_) == -1)

            {

              result = -2; // -2 means we need to release the mutex.

              break;
            }
 
          rw->num_waiting_writers_--;
        }

读锁:while (rw->ref_count_ < 0 || rw->num_waiting_writers_ > 0)

        {
          rw->num_waiting_readers_++;

          if (ACE_OS::cond_wait (&rw->waiting_readers_, &rw->lock_) == -1)

            {

              result = -2; // -2 means that we need to release the mutex.

              break;
            }
          rw->num_waiting_readers_--;
        }
这就是实现的Win32的代码,也就是说,对于读来说,只要没有用户正在写,就可以跳出循环;但对于写用户来说,必须要没有用户持有锁才可以跳出循环,无论是读用户还是写用户。对于Posix来说就简单了,直接调用系统提供的读写机制就可以。
 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值