社区
C++ Builder
帖子详情
如何防止TThreadList死锁
jingzu
2007-04-16 08:27:11
我在多线程中的多个类中使用TThreadList,发现很容易发生死锁,如果防止死锁?
...全文
536
14
打赏
收藏
如何防止TThreadList死锁
我在多线程中的多个类中使用TThreadList,发现很容易发生死锁,如果防止死锁?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tsk
2009-09-23
打赏
举报
回复
受益良多。
僵哥
2007-04-28
打赏
举报
回复
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,代码显得有些乱)。
EagleFew
2007-04-28
打赏
举报
回复
TThreadList 其实就是 TList + 临界段
可以这样使用 :
TThreadList *hlstThread = new TThreadList();
TList *lst = NULL;
lst = hlstThread->LockList(); // 在这里进入临界段
// 使用lst 操作完成后
hlstThread->UnlockList(); // 在这里退出临界段
他们必须配对使用否则,就会发生死锁
FFSB
2007-04-27
打赏
举报
回复
gz
痞子酷
2007-04-25
打赏
举报
回复
try
{
LockList
...
}
__finally
{
UnlockList
}
ghostkissangel
2007-04-25
打赏
举报
回复
sleep(毫秒) 一下,交给主程序一段时间
huzhangyou
2007-04-17
打赏
举报
回复
防止死锁要考虑的问题很多
使用TCriticalSection要释放
zwh202342
2007-04-17
打赏
举报
回复
私有的不会相互影响
Waiting4you
2007-04-17
打赏
举报
回复
我说的嵌套LockList/UnlockList对当然是指同一个TThreadList实例啦
kangji
2007-04-16
打赏
举报
回复
嵌套可以,但是你的思路不要乱
私有的不会相互影响
chenxidu
2007-04-16
打赏
举报
回复
以前老师告诉我,少使用不必要的指针
jingzu
2007-04-16
打赏
举报
回复
我每个类中都说明了一个自己的私有TThreadLis,会相互影响吗?
jingzu
2007-04-16
打赏
举报
回复
是不能嵌套LockList/UnlockList对吗?
Waiting4you
2007-04-16
打赏
举报
回复
LockList后不要忘记UnlockList
不要嵌套LockList/UnlockList对(这个要小心,比如你的基类里每个方法都用了Lock对, 继承后Lock了又调用基类的方法,或者相互调用都有可以嵌套)
c++ builder 多线程
c++ builder 多线程方法和实例,
delphi 多线程
delphi 多线程 强大的控件 很好用·············
队列加多线程的例子
一个动态队列和多线程的例子,可动态设置任务数和线程数
Delphi多线程详解.pdf
Delphi多线程详解,详细的内容见,Delphi多线程详解.pdf
Delphi中线程实例
Delphi中线程实例,大家有需要的可以参考下
C++ Builder
13,873
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章