MyException - 我的异常网
当前位置:我的异常网» C++ Builder » 怎么防止TThreadList死锁

怎么防止TThreadList死锁

www.MyException.Cn  网友分享于:2013-03-18  浏览:57次
如何防止TThreadList死锁
我在多线程中的多个类中使用TThreadList,发现很容易发生死锁,如果防止死锁?

------解决方案--------------------
LockList后不要忘记UnlockList

不要嵌套LockList/UnlockList对(这个要小心,比如你的基类里每个方法都用了Lock对, 继承后Lock了又调用基类的方法,或者相互调用都有可以嵌套)
------解决方案--------------------
嵌套可以,但是你的思路不要乱

私有的不会相互影响

------解决方案--------------------
私有的不会相互影响
------解决方案--------------------
防止死锁要考虑的问题很多
使用TCriticalSection要释放
------解决方案--------------------
try
{
LockList
...
}
__finally
{
UnlockList
}
------解决方案--------------------
TThreadList 其实就是 TList + 临界段
可以这样使用 :

TThreadList *hlstThread = new TThreadList();
TList *lst = NULL;

lst = hlstThread-> LockList(); // 在这里进入临界段
// 使用lst 操作完成后
hlstThread-> UnlockList(); // 在这里退出临界段

他们必须配对使用否则,就会发生死锁
------解决方案--------------------
try
{
LockList
...
}
__finally
{
UnlockList
}
===============================
很奇怪,我看到有很多人都喜欢这种写法,但是我很反对,万一LockList失败,那么也会执行到UnlockList,则这个执行就不是必要的,如果是多次嵌套,则中间有一次,出现如此错误,就会导致不必要的解锁,而导致访问冲突,或者说达不到Lock的效果。这只是其中一种情况。
另一种是创建一个对象然后释放。

TStringList *StringList;
try
{
StringList=new TStringList();
}
__finally
{
StringList-> Free();
}

象这种,如果是在new TStringList的时候,由于内存不足等原因,则导致不成功,同样会执行finally,则会有什么情况?StringList是一个无效的指针,去执行Free,导致的将可能是内存访问违例,甚至会引发线程崩溃。


虽然很多人都有使用try ... finally的习惯,为的就是保证内存被释放或者锁定的资源出现异常也能被解锁,但是使用不当也会带来严重的问题,或者说这个问题本身是不必要的。相反,换成下面的结构:
TStringList *StringList=new TStringList();
try
{

}
__finally
{
StringList-> Free();
}

当在new的时候就出现异常,根本就不用担心会执行到try,更不用担心执行到__finally。而会直接跳到外层的异常处理结构当中。

去年的时候,接手公司一个旧的项目,当时某高人写的代码,首先是如楼上,并且允许创建的线程是无限的,于是用户配置线程数达1.5k(还有其它的服务程序在同一机器运行,所以实际创建的线程数量只到1.2k就上不去了),从而由于try(create)finally (free) 的结构,而导致异常。当时承载的用户量是3.5k。出了问题就让查,结果就是查不出个所以然来。接手之后,我是很偶然地发现了使用的是这种结构(由于代码特别长,并且是后期加入的try...finally,代码显得有些乱)。

文章评论

如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员必看的十大电影
程序员必看的十大电影
编程语言是女人
编程语言是女人
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员的鄙视链
程序员的鄙视链
漫画:程序员的工作
漫画:程序员的工作
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Java程序员必看电影
Java程序员必看电影
如何成为一名黑客
如何成为一名黑客
程序员和编码员之间的区别
程序员和编码员之间的区别
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员都该阅读的书
程序员都该阅读的书
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
中美印日四国程序员比较
中美印日四国程序员比较
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
老程序员的下场
老程序员的下场
我的丈夫是个程序员
我的丈夫是个程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
 程序员的样子
程序员的样子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
总结2014中国互联网十大段子
总结2014中国互联网十大段子
鲜为人知的编程真相
鲜为人知的编程真相
我是如何打败拖延症的
我是如何打败拖延症的
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
那些争议最大的编程观点
那些争议最大的编程观点
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
每天工作4小时的程序员
每天工作4小时的程序员
旅行,写作,编程
旅行,写作,编程
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有