代码之美 :ACE中的互斥体(锁),很好用的线程守护宏定义
本帖最后由 nettoobad 于 2014-6-7 12:03 编辑在多线程编程中,互斥体(锁)的应用非常广泛,如何编写漂亮的锁代码也是很关键的呦,当然使用互斥体(锁)的原语来编写也是可以的,但是,在实践工作中,一般使用更简单的自释放来处理锁的请求和释放。如果详细分类,有下面四种哦。
第零种:很少用,但必须知道,这是原理,主要在//todo的地方万一代码崩了,锁就可能死锁,所以衍生出了下面的三种形式,以第三种最为强健,完善,推荐使用:
ACE_Recursive_Thread_Mutex g
g.acquire();
//todo
g.release();
第一种:
//进步一些,用ACE_Guard的构造、析构函数保证锁的释放。
ACE_Guard<ACE_Recursive_Thread_Mutex> g(thread_mutex);
第二种:
//又进步一些,能有个处理分支,但是比较单一,不能处理锁定和锁定失败的两种情况
ACE_GUARD(ACE_Recursive_Thread_Mutex,g,thread_mutex);
第三种:
//修成正果,两种情况均能处理,其实第二种是在第三种方式的基础上封装的简化版
ACE_GUARD_ACTION(ACE_Recursive_Thread_Mutex,g,thread_mutex,
ACE_DEBUG((LM_DEBUG,ACE_TEXT("QtTest::resizeEvent锁定成功")));go to p1; ,
ACE_DEBUG((LM_DEBUG,ACE_TEXT("QtTest::resizeEvent锁定失败")));go to p2;); 锁有锁的问题。1是性能损失,2是有死锁的可能性。凡是遇到需要加锁的地方,都要十分留神。 winston 发表于 2014-6-8 15:30
锁有锁的问题。1是性能损失,2是有死锁的可能性。凡是遇到需要加锁的地方,都要十分留神。 ...
1.性能损失, 用读写锁性能只在几个毫秒之间几乎没有,如果你是做游戏的话,可以看下吴云洋的无锁队列
http://blog.codingnow.com/2012/06/dev_note_21.html#more
2.死锁
这个完全是设计问题,锁规则,第三方库接口不加锁 回调函数不加锁 一般不会死锁
页:
[1]