探讨个问题关于多线程

方正夜明 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);//开始线程,代入参数
}
...全文
199 9 打赏 收藏 转发到动态 举报
写回复
用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个线程太多了,还是用线程池吧。
exception92 2019-05-22
  • 打赏
  • 举报
回复
我把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个线程... 还是用线程池把
Vulkan被称为OpenGL的接班人,性能果然是霸气外漏,更能够承载下一个时代的图形渲染编程。 GPU高性能渲染的课题进入了一个新的阶段,对于计算细节的控制,多核CPU多线程渲染以及高性能算法的灵活设计需求日益旺盛。图形程序员需要有更加强力且灵活的工具,来“解锁”我们自身的控制能力,OpenGL的较高度封装性以及单纯的状态机模式显然已经无法适应现代化图形渲染的强烈需求。为什么要学习Vulkan?正如前言所说,Vulkan已经成为了下一个时代的图形渲染主流API,早已经被各大商业引擎(Unreal Engine、Unity3D)所支持。那么我们的同学就有如下问题需要明晰:1 作为游戏程序员我们只学会了UE或者Unity3D,那么就只能作为一个普通的程序员,如果能够结合Vulkan的学习对商用引擎理解更加深刻,就可以更好的发挥引擎威力甚至更改引擎的源代码,实现更多的可能,让你在各大公司之间都“蛇形走位,游刃有余” 2 作为自研引擎工作人员,你可能在工业软件领域从业、也有可能在影视渲染领域从业、也可能在其他的图形系统领域(军工、GIS、BIM)等领域,那么熟练的掌握Vulkan就可以针对自己公司的不同领域需求进行不同的引擎定制开发,从而获得牢不可破的地位,对于自身职业发展有着极大的优势! 总而言之,越早学习Vulkan,就越能与别人拉开差距,让Vulkan称为你升职加薪、壮大不可替代性的核武器! 课程简介:本课程详细讲解了Vulkan从小白到入门的基础理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了计算机图形学基础理论,计算机图形学数学推导,Vulkan基础系统设计理论,基础单元(实例,设备,交换链), 渲染管线,RenderPass, 指令与多线程, 顶点描述与实验, Uniform与描述符, 图像与采样, 深度与反走样,模型与摄像机等内容;课程中会对Vulkan复杂抽象的API进行一次包装层的封装,将相关的API都进行聚合与接口设计,作为游戏或者图形引擎来讲,这是至关重要的第一步。这一个封装步骤,也被称为API-Wrapper,经过包装后的类库,同学可以在此之上根据自己的具体需求进行扩展,从而得到最适合自己的类库内容。本课程为系列化课程,在铸造基石篇章之后,会继续使用本包装类库进行改良,并且实现Vulkan API下的各类效果以及高级特性的开发教学。 课程优势:1 本课程会从计算机图形学的基础渲染管线原理出发,带领0基础的同学对计算机图形学进行快速认知,且对必要的知识点进行筛选提炼,去掉冗余繁杂的教学内容,更加适合新手对Vulkan渲染体系入门了解。 2 本课程会对计算机图形学所涉及的数学知识及如何应用到渲染当中,进行深入的讲解,带领同学对每一行公式展开认识,从三维世界如何映射到二维的屏幕,在学习完毕后会有清晰的知识体系 3 本课程会带领同学认知每一个Vulkan的API,并且在代码当中插入详细的注释,同学们在学习的时候就可以参照源代码进行一系列尝试以及学后复习 4 本课程所设计的包装层,会带领同学一行一行代码实现,现场进行Debug,对于Vulkan常出现的一些问题进行深入探讨与现场纠正  学习所得:1 同学们在学习后可以完全了解从三维世界的抽象物体,如何一步步渲染称为一个屏幕上的像素点。2 同学们在学习后可以完全掌握基础的Vulkan图形API,并且了解Vulkan当中繁多的对象之间相互的联系,从而可以设计更好的图形程序3 同学们在跟随课程进行代码编写后,可以获得一个轻量级的Vulkan底层API封装库(Wrapper),从而可以在此之上封装上层的应用,得到自己的迷你Vulkan图形渲染引擎当然,在达到如上三点之后,如果可以更进一步学习Vulkan的进阶课程,同学们可以获得更好的职业发展,升职加薪之路会更加清晰,成为公司不可替代的强力工程师 本课程含有全套源代码,同学购买后,可以在课程附件当中下载 完全不懂图形学可以学习么?使用层面上来讲是没有问题的,老师在每个api讲解的时候,都会仔细分析api背后的原理,所以可以跟随下来的话,能够编程与原理相融,学会使用 数学不好可以学习么?学习图形类课程,最好能够入门级别的线性代数,具体说就是: 1 向量操作 2 矩阵乘法 3 矩阵的逆、转置 这几个点就足够 学习后对就业面试有什么作用?目前类似Vulkan的渲染知识是一切引擎的基础,只要能够跟随每一节课写代码做下来,游戏公司、工业软件公司等都是非常容易进去的,因为原理层面已经通晓,面试就会特别有优势。同学可以在简历上写熟悉VulkanAPI并且有代码经验,对于建立筛选以及面试都会有很大的帮助,对于薪资也会有大幅度提升

110,537

社区成员

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

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

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