这几天在调试socket多客户端问题,有很多地方需要用锁来保护,所以我们自然而然的用起了AutoLock。哈哈。代码会出现下面的情况:
{
AutoLock l(mutexA);
xxxx
}
{
AutoLock l(mutexB);
xxxxx
}
代码的逻辑上没啥问题,但是代码的观赏性上就比较差了,整个代码被莫名的好多的大括号隔断,而且要是要看具体的那把锁,我还需要看代码,不能像java那样清晰明了。如下代码,我们一看就知道整个锁的周期,以及具体是哪把锁。
synchronized(obj) {
xxxxx
}
所以利用for语句,我在obotcha里面简单实现了一个Synchronized
#define Synchronized(X) for(AutoLock __l__(X);X->isOwner();__l__.release())
实际上还是利用了autolock的原理
1.初始化时直接申请AutoLock
AutoLock __l__(X)
2.如果拿到锁,那么isOwner返回是true
X->isOwner()
3.第一次运行完成,释放autolock,这样isOwner就会返回false。运行结束~。
__l__.release()
使用起来基本和java相同:
Synchronized(mutex) {
xxxx
}
唯一的区别是Synchronized的参数是lock,而java是object。哈哈。