ITPub博客

首页 > 数据库 > 数据库开发技术 > 为什么Thread.Start方法在CPU负载过高时被阻塞?

为什么Thread.Start方法在CPU负载过高时被阻塞?

原创 数据库开发技术 作者:后端Q 时间:2021-11-29 00:00:00 0 删除 编辑

前几天早上遇到服务不能访问的问题 ,第一时间看了服务器,哇kao;

cpu100%  。 瞬间觉得奇怪,昨天发布之后,一直好好的 怎么突然这样;

突然想起来  ,现在是访问高峰。

那么是什么问题呢,看了下日志 ,发现大量的访问线程取消的;想了下这次没做什么改动啊,突然想起来,之前加了个多线程操作的,这个操作正好是在那个高峰访问接口触发的;第一时间感觉没错,就是这个问题。于是赶紧把代码注释,重新发布,几分钟之后,服务正常了。


那么出问题的是什么代码呢 。如下截图



触发条件是用户访问接口的时候;这样就产生大量的线程。

首先由于每台计算机能进行的并行是有上限的,经过测试本机的上限为1023个左右(win7 64位,i3 2核4线程)。所以线程数的CPU抢占消耗都是极高。


后面看了代码发现项目很多地方都是这么写的,但是一直没问题,是因为很多方法访问量很小,还没达到高压线。


最后解决办法


1、多线程最好是采用线程池,限制数量

2、消息队列方式

3、定时任务,处理业务



此外,我发现这个:

当你调用线程。在线程上启动方法,该线程可能为 或可能不会立即开始执行,具体取决于处理器的数量和当前等待执行的线程数。

https://msdn.microsoft.com/en-us/library/1c9txz50(v=vs.110).aspx




原文作者:后端Q;如有侵权,请联系管理员删除。

下一篇: C#Socket通信
请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    726093