nettoobad 发表于 2014-6-7 10:19:59

代码之美 :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;);

winston 发表于 2014-6-8 15:30:09

锁有锁的问题。1是性能损失,2是有死锁的可能性。凡是遇到需要加锁的地方,都要十分留神。

minchieh 发表于 2014-8-25 01:04:06

winston 发表于 2014-6-8 15:30
锁有锁的问题。1是性能损失,2是有死锁的可能性。凡是遇到需要加锁的地方,都要十分留神。 ...

1.性能损失,    用读写锁性能只在几个毫秒之间几乎没有,如果你是做游戏的话,可以看下吴云洋的无锁队列
http://blog.codingnow.com/2012/06/dev_note_21.html#more
2.死锁   
这个完全是设计问题,锁规则,第三方库接口不加锁   回调函数不加锁    一般不会死锁
页: [1]
查看完整版本: 代码之美 :ACE中的互斥体(锁),很好用的线程守护宏定义