探讨个问题关于多线程

方正夜明 2019-05-22 03:07:57
我把1件事情分成1000份
每份事情交给一个线程去做

刚开始的时候速度的确很快,但随着线程结束后回归(几百的线程回归)
似乎会阻塞其他线程的执行?导致最后的线程一直在等待其他的999线程回归后才能继续执行


//threadNum = 1000
//根据上传线程数计算分页上传页数和单页上传数据数
int forNum = threadNum;
double totalRows = dss.Tables[0].Rows.Count;
double perUploadDataRows = Math.Floor(Convert.ToDouble(totalRows / forNum));
int otherDataRows = (int)totalRows % forNum;
Console.WriteLine("每页上传数[" + perUploadDataRows + "]");
for (int i = 0; i < forNum; i++)
{
if (i == 0)
startIndex[i] = 0;
else
startIndex[i] = (int)perUploadDataRows * i;

if(i == forNum - 1)
endIndex[i] = (int)perUploadDataRows * (i + 1) + otherDataRows;
else
endIndex[i] = (int)perUploadDataRows * (i + 1);
Console.WriteLine(i + "号线程搜索区间:[" + startIndex[i] + "-" + endIndex[i] + "]");
//启动病案查询线程线程
th_PerThreadUpload[i] = new Thread(PerThreadUpload);
th_PerThreadUpload[i].Start(i);//开始线程,代入参数
}
...全文
243 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
OrdinaryCoder 2019-05-23
  • 打赏
  • 举报
回复
我觉得可能是你开辟的线程太多 后面的线程都没被分配到时间片 也就是没跑或者跑一半切到别的线程了
方正夜明 2019-05-23
  • 打赏
  • 举报
回复
引用 6 楼 exception92 的回复:
我把1件事情分成1000份
每份事情交给一个线程去做
-》1000个线程? 没有这么搞的,也不能这么搞。不能以为线程无所不能,更不能以为线程越多程序处理效率越高。

似乎会阻塞其他线程的执行?
-》并不是阻塞,而是操作系统发现已经没有可以利用的线程了!!!


数据量小还可以,数据量大的确就蹦了
love氟利昂 2019-05-22
  • 打赏
  • 举报
回复
(1)线程越多,线程的启动和销毁会占用更多的资源。
(2)线程越多,CPU更可能发生更多的上下文切换,可能会占用更多的资源。
(3)线程越多,GC的效率越低,执行GC时需要CLR挂起所有的线程,会占用更多的资源。
(4)相对于CPU的执行效率,IO的瓶颈十分明显。
1000个线程太多了,还是用线程池吧。
  • 打赏
  • 举报
回复
我把1件事情分成1000份 每份事情交给一个线程去做 -》1000个线程? 没有这么搞的,也不能这么搞。不能以为线程无所不能,更不能以为线程越多程序处理效率越高。 似乎会阻塞其他线程的执行? -》并不是阻塞,而是操作系统发现已经没有可以利用的线程了!!!
方正夜明 2019-05-22
  • 打赏
  • 举报
回复
引用 4 楼 stherix 的回复:
[quote=引用 3 楼 方正夜明 的回复:]
[quote=引用 1 楼 stherix 的回复:]
1000个线程... 还是用线程池把

这样子似乎只是让线程均匀回归而已,与我上面原来的方案速度差不多,区别在于用线程池的执行速度比较稳定但慢(因为线程回归的时间均匀分布在各个线程执行的过程中),而我的方式在任务前面70%的时候执行的速度是非常快的,只是后面都卡在线程回归的等待上,两者最终耗时是差不多的。[/quote]

本身就不能加快速度,尤其可能瓶颈并不是在CPU上面,而是数据库访问/网络传输等等
而且过多的线程反而会加大CPU调度的压力,一般CPU核心线程就只有8,16等等[/quote]

数据是现成的,我是取好的。看来没啥好的方法了,要是一直能咻咻咻的,不用等待就好了。
stherix 2019-05-22
  • 打赏
  • 举报
回复
引用 3 楼 方正夜明 的回复:
[quote=引用 1 楼 stherix 的回复:] 1000个线程... 还是用线程池把
这样子似乎只是让线程均匀回归而已,与我上面原来的方案速度差不多,区别在于用线程池的执行速度比较稳定但慢(因为线程回归的时间均匀分布在各个线程执行的过程中),而我的方式在任务前面70%的时候执行的速度是非常快的,只是后面都卡在线程回归的等待上,两者最终耗时是差不多的。[/quote] 本身就不能加快速度,尤其可能瓶颈并不是在CPU上面,而是数据库访问/网络传输等等 而且过多的线程反而会加大CPU调度的压力,一般CPU核心线程就只有8,16等等
方正夜明 2019-05-22
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
1000个线程... 还是用线程池把

这样子似乎只是让线程均匀回归而已,与我上面原来的方案速度差不多,区别在于用线程池的执行速度比较稳定但慢(因为线程回归的时间均匀分布在各个线程执行的过程中),而我的方式在任务前面70%的时候执行的速度是非常快的,只是后面都卡在线程回归的等待上,两者最终耗时是差不多的。
bloodish 2019-05-22
  • 打赏
  • 举报
回复

//如果不需要等待所有线程执行完成就可以继续后面的流程
Task.Run(() => Parallel.For(0, forNum, i => PerThreadUpload(i)));

//如果需要等待所有线程执行完成才可以继续后面的流程
Parallel.For(0, forNum, i => {PerThreadUpload(i));
stherix 2019-05-22
  • 打赏
  • 举报
回复
1000个线程... 还是用线程池把

111,097

社区成员

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

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

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