这样算不算线程死锁状态

l12555712 2008-12-07 07:24:58
加精
我建立了同时运行多个线程。有的时候如果数据量小的话(几条的时候)就可以完成执行完成。但一量数据量大了。他就有的时候执行到几十条后就停下来。有的时候几百条就停下来。就是因为这样我无法调试他。。。有没有好的谁能够告诉我一些好的办法。如何能解决这个问题呀。我写的源码能不能帮忙的看一下呀

因为代码太长无法贴出来。写在下面的二个文件里面
http://www.dztv.cn/rh/delphi/unit1.txt FOrm页面
http://www.dztv.cn/rh/delphi/Thread.txt 线程页面
...全文
1261 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanCSDN 2011-01-19
  • 打赏
  • 举报
回复
路过。学习
surewy 2008-12-15
  • 打赏
  • 举报
回复
mark
quanbuzic 2008-12-12
  • 打赏
  • 举报
回复
有的时候如果数据量小的话(几条的时候)就可以完成执行完成。
soft2hard 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 l12555712 的回复:]
引用 42 楼 coding_hello 的回复:
引用 40 楼 l12555712 的回复:
在无尽的耐心等待与想办法后。终于把线程的问题解决了。但不知道原理是怎么回事。

一开始我按照平常写线程那样的方法来写我的线程。
strurl := Tgetstr; //接收传递过来的地址
xdshu := Tgetshu; //传递过来的线程
Tmo := Tgetmo;
Tsta:=Tsta1;
FreeOnTerminate := True; // 自动删除
InitializeCriticalSection(CS); //初始化临…
[/Quote]
我理解楼主, 能力不是一天就能提高的. 多问是个好习惯.但高手不一定有耐心来详细解释. 就这个问题来说,我强烈建议楼主试试Intel的thread checker, 花很少的时间安装并运行他,可以查出潜藏的会造成各种线程问题的代码,并给你解释,试用期可以用一个月,功能都有效. 免费请个高手来帮你查问题,查不出也不费什么. 何乐而不为呢.
xunhangfanchuan 2008-12-10
  • 打赏
  • 举报
回复
顶一下!
l12555712 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 soft2hard 的回复:]
引用 43 楼 l12555712 的回复:
引用 42 楼 coding_hello 的回复:
引用 40 楼 l12555712 的回复:
在无尽的耐心等待与想办法后。终于把线程的问题解决了。但不知道原理是怎么回事。

一开始我按照平常写线程那样的方法来写我的线程。
strurl := Tgetstr; //接收传递过来的地址
xdshu := Tgetshu; //传递过来的线程
Tmo := Tgetmo;
Tsta:=Tsta1;
FreeOnTerminate := True; // 自动删除
Initializ…
[/Quote]

嗯。我也支持你的观点。所以在很早之前楼上的朋友就提出让我去下一个那样的软件。后来我也下载回来。然后查看了一下入口有问题。后来删除临界区就可以运行了。。。
xiewhenwe 2008-12-10
  • 打赏
  • 举报
回复
楼上的楼上讲的好,我也试试,谢过了,学习中。。。
tombyte 2008-12-10
  • 打赏
  • 举报
回复
Mobile接单群,qq群:44045541,专注mobile开发应用软件开发、项目开发共享、欢迎开发人员、业务人员。
Li103ZzZ 2008-12-09
  • 打赏
  • 举报
回复
up
tang3dashu 2008-12-09
  • 打赏
  • 举报
回复


1,自己做一个线程池 jdk里边就有提供
2,如果会并发的时候会访问到同一个数据(或者常来的话)需要给那个方法体加 同步方法。或者直接对那个变量加读写锁。
l12555712 2008-12-09
  • 打赏
  • 举报
回复
在无尽的耐心等待与想办法后。终于把线程的问题解决了。但不知道原理是怎么回事。

一开始我按照平常写线程那样的方法来写我的线程。
strurl := Tgetstr; //接收传递过来的地址
xdshu := Tgetshu; //传递过来的线程
Tmo := Tgetmo;
Tsta:=Tsta1;
FreeOnTerminate := True; // 自动删除
InitializeCriticalSection(CS); //初始化临界区
inherited Create(False); // 直接运行

因为一直都进行临界区模式来写我的程序。所以老是执行到一半的时候就卡在那里动也不动了。。
后来我把他临界区去除后。程序整体运行完全正常。。
strurl := Tgetstr; //接收传递过来的地址
xdshu := Tgetshu; //传递过来的线程
Tmo := Tgetmo;
Tsta:=Tsta1;
FreeOnTerminate := True; // 自动删除
// InitializeCriticalSection(CS); //初始化临界区
inherited Create(False); // 直接运行

为什么使用临界区就会产生这样的线程突然间的停下来呢?
intel_zhenyuwang 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 goldencode 的回复:]
因为"代码太长",所以没有打开连接看你的代码赫赫. 不过提点建议看看是否有帮助, 想要确定是否是死锁可以用Intel的thread profiler,来看呀. 很直观的. 先下个评估版,功能一样的.30天之内查这个问题应该绰绰有余了. 以后再想用还可以找他们要.

[/Quote]
使用Intel(R) Thread Checker, 几分钟搞定.
FoxOnWeb 2008-12-09
  • 打赏
  • 举报
回复
提供点思路

1, 我没看出你cs有什么作用,你完全可以只用Synchronize,大不了再另建一个procedure

2, 是不是线程本身有问题,线程异常后终止

3, 二分法确定线程到多少数目时发生问题,再具体分析。

langzulajiao 2008-12-09
  • 打赏
  • 举报
回复
学习
dd_zhouqian 2008-12-09
  • 打赏
  • 举报
回复
yinxd6112 说的很对,不过也可以分析一次,再执行一条。只不过执行的线程一直处于等待状态而已!
csgdseed 2008-12-09
  • 打赏
  • 举报
回复
up
ziling198310 2008-12-09
  • 打赏
  • 举报
回复
到底要多少分才可以下东西
ziling198310 2008-12-09
  • 打赏
  • 举报
回复
.........................
ziling198310 2008-12-09
  • 打赏
  • 举报
回复
luguo
l12555712 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 FoxOnWeb 的回复:]
提供点思路

1, 我没看出你cs有什么作用,你完全可以只用Synchronize,大不了再另建一个procedure

2, 是不是线程本身有问题,线程异常后终止

3, 二分法确定线程到多少数目时发生问题,再具体分析。
[/Quote]

嗯。一开始我觉得应该是字符串数组溢出造成的[然后我又换了直接传地址过去也一样出错],再然后我就全部都加了try异常处理,但他还是出错(每一个小部份都加上,无一漏出)。.到后来我实在没办法了就把cs去除之后。他就完全没有再出现过这个问题。所以在这样的情况下的话我就糊涂了。
1:有的人说synchronize最好带上临界. 但有的人说不要。我个人比较懒。一般不带没啥问题...
2:但是如果真的是临区的问题话。应该是某段代码冲突了(在出现这个问题后。我反复重新写了六次线程(实践过,和在网上下载过一些代码来查看..))
加载更多回复(34)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧