找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 13156|回复: 2

代码之美 :ACE中的互斥体(锁),很好用的线程守护宏定义

[复制链接]
发表于 2014-6-7 10:19:59 | 显示全部楼层 |阅读模式
本帖最后由 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;);
发表于 2014-6-8 15:30:09 | 显示全部楼层
锁有锁的问题。1是性能损失,2是有死锁的可能性。凡是遇到需要加锁的地方,都要十分留神。

点评

1.性能损失, 用读写锁性能只在几个毫秒之间 几乎没有,如果你是做游戏的话,可以看下吴云洋的无锁队列 http://blog.codingnow.com/2012/06/dev_note_21.html#more 2.死锁 这个完全是设计问题, 锁规则,第三方  详情 回复 发表于 2014-8-25 01:04
发表于 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.死锁   
这个完全是设计问题,  锁规则,第三方库接口不加锁   回调函数不加锁    一般不会死锁
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 18:06 , Processed in 0.019768 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表