ACE_Guard的运用

对于,线程锁来说,最可怕就是出现由于某种原因没有解锁从而造成线程死锁。C++的对象构造和析构给出了很好的办法,具体的实现不外乎先前《自行释放ACE_Message_Block》中所写的那样。这里所要说的是ACE已经作了的工作。

#define ACE_GUARD_ACTION(MUTEX, OBJ, LOCK, ACTION, REACTION) /

   ACE_Guard< MUTEX > OBJ (LOCK); /

   if (OBJ.locked () != 0) { ACTION; } /

   else { REACTION; }

#define ACE_GUARD_REACTION(MUTEX, OBJ, LOCK, REACTION) /

 ACE_GUARD_ACTION(MUTEX, OBJ, LOCK, ;, REACTION)

#define ACE_GUARD(MUTEX, OBJ, LOCK) /

 ACE_GUARD_REACTION(MUTEX, OBJ, LOCK, return)

#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN) /

 ACE_GUARD_REACTION(MUTEX, OBJ, LOCK, return RETURN)

这是ACE定义的宏,用这些宏可以方便地节省很多代码量,虽然实际上代码就是一样的。Metex代表锁的种类,Obj代表ACE_Guard的对象,ACTION代表成功的动作,REACTION代表加锁失败的动作。
在ACE中存在读锁和写锁的区别,所以这些宏ACE_Guard也会派生出读锁和写锁。ACE_Guard存在显示的加锁和解锁,但在构造的时候会默认加锁。析构的时候会根据对象是否认为已经加锁,来进行解锁。当然还存在一些其他函数,但这并非是重点了。
写着这些是认为ACE_Guard是非常重要的。我并不认为很多人会产生加锁的不对称,然而没有知道异常什么时候会发生,所以就审慎一些为好。然而事务都是两面的,这容易产生加锁范围过大的情况,给死锁的形成埋下隐患,所以要适时显示解锁。加锁的原则就是范围越小越好。
 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值