启动子线程,子线程有时莫名停下了不往下执行,也没有error报出!

leskey 2014-09-15 03:26:29
在一个线程中,启动子线程

Thread th1 = new Thread(new ThreadStart(。。。。。。));

某些时候这个子线程刚刚进去执行了一段code后就不动了,也没有error报出。

我在中间加了很多的log来调试,发现每次停的地方都可能不一样,好像就是执行忽然断了。我在其他地方没有kill这个子线程。。。

忘指点!!!
...全文
902 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_31130951 2016-12-30
  • 打赏
  • 举报
回复
遇到同样问题,请问楼主问题解决了吗?是怎么解决的?求教指点
cquptwuyf 2014-09-17
  • 打赏
  • 举报
回复
更改线程的优先级,看看每次阻塞的线程是不是优先级最低的那个。如果是的话,说明优先级高的线程一直在占用CPU资源。
leskey 2014-09-16
  • 打赏
  • 举报
回复
up, 帮我看看
leskey 2014-09-15
  • 打赏
  • 举报
回复
子线程停在某个地方不往下执行,对应的父进程也会死住。。。就是看不出里面啥问题
xian_wwq 2014-09-15
  • 打赏
  • 举报
回复
引用 10 楼 leskey 的回复:
打印日志是用来调试用的,可以看子线程运行到哪里,如果出错的话。 打印日志都有try处理的。
我得意思是打印日志是否做过同步处理?
leskey 2014-09-15
  • 打赏
  • 举报
回复
打印日志是用来调试用的,可以看子线程运行到哪里,如果出错的话。 打印日志都有try处理的。
xian_wwq 2014-09-15
  • 打赏
  • 举报
回复
如何确认线程的工作状态,是通过打印的日志吗? addlog方法是否线程安全?
leskey 2014-09-15
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
除非死锁或者处理逻辑在等待某个信号量, 否则,线程不会莫名停下的
我同时开16个线程,4个一组;每个线程中间根据需要会开子线程,然后中间启动子线程的时候有时会莫名停下来;其他组的线程还是正常测试。。。 所以测试下来可能是全成功,也可能是3组成功,另一组停在某个地方就不动了,没有error报出
leskey 2014-09-15
  • 打赏
  • 举报
回复
引用 5 楼 zhi_ai_yaya 的回复:
如此贴代码再说。
父线程中: while (testingSSD.IsWatchingITS) { data = null; bytes = new Byte[1024]; bytesRec = handler.Receive(bytes); data = Encoding.ASCII.GetString(bytes, 0, bytesRec); if (string.IsNullOrEmpty(data)) { data = ""; } breakflag = false; ParseMessageFromITS(data, out breakflag); if (breakflag) { break; } if (data != "" && testingSSD.TestResult == SSDTestResult.SYNC && !GlobalVariables.BlockSyncWaitFalg) { try { GlobalVariables.BlockSyncWaitFalg = true; BlockSyncClass bsc = new BlockSyncClass(); bsc.SetSlave(0, Convert.ToInt16(testingSSD.SLot) - 1); blocksyncthread = new Thread(new ThreadStart(bsc.BlockSyncThreadEnter)); blocksyncthread.Name = "BlockSyncThread_" + testingSSD.SLot + "_" + testingSSD.TestBlockName; blocksyncthread.Start(); Thread.Sleep(3000); bsc = null; addlog(...); } catch (Exception eeex) { addlog(...); } } } 子线程: private int _slave = 0; private int _idx = -1; public void SetSlave(int _slv, int _id) { _slave = _slv; _idx = _id; } public void BlockSyncThreadEnter() { try { if (...) StartSyncBlockTest(); else if (..) StartSyncBlockTest_PCIE(); } catch(Exception e) { addlog(...); } } private void StartSyncBlockTest_PCIE() { while (true) { ............ } } 大体就是这样的code,具体的就不贴了,太多了。
xian_wwq 2014-09-15
  • 打赏
  • 举报
回复
除非死锁或者处理逻辑在等待某个信号量, 否则,线程不会莫名停下的
我叫小菜菜 2014-09-15
  • 打赏
  • 举报
回复
如此贴代码再说。
leskey 2014-09-15
  • 打赏
  • 举报
回复
引用 3 楼 bdmh 的回复:
加锁了吗,是不是被锁住,进不去
没有加锁。有时候启动线程的时候就停在那里了,也没有错误报出,不知道怎么处理这样的问题了
bdmh 2014-09-15
  • 打赏
  • 举报
回复
加锁了吗,是不是被锁住,进不去
leskey 2014-09-15
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
是不是数据冲突了,没有同步造成访问数据错误
应该不是,如果冲突,不也应该出错么。。。code打印了某个log后,就不再打印了,不知道为啥
bdmh 2014-09-15
  • 打赏
  • 举报
回复
是不是数据冲突了,没有同步造成访问数据错误

110,559

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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