问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C# 关于多线程和CPU的问题

发布网友 发布时间:2022-04-26 18:41

我来回答

3个回答

热心网友 时间:2023-10-21 14:00

1.CPU发展趋势
核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进。笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连:),因为全相连太过复杂,单总线又不够给力。而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器。

2.多线程与并行计算的区别
(1)多线程的作用不只是用作并行计算,他还有很多很有益的作用。
还在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于
while(1)
{
if(flag==1)
break;
sleep(1);
}
这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。
阻塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道CPU是数着纳秒过日子的。
所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。

同样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做“并发”,这和并行是有着本质的不同的。并发是“伪并行”,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程序就会假死,因为程序在忙着执行,没空搭理用户的其他操作;而如果你把这个按钮触发的函数赋给一个线程,然后启动线程去执行,那么程序就不会假死,继续相应用户的其他操作。但是,随之而来的就是线程的互斥和同步、死锁等问题,详细见有关文献。
现在是多核时代了,这种线程的互斥和同步问题是更加严峻的,单核时代大都算并发,多核时代真的就大为不同,为什么呢?具体细节请参考有关文献。我这里简单解释一下,以前volatile型变量的使用可以解决大部分问题,例如多个线程共同访问一个Flag标志位,如果是单核并发,基本不会出问题(P.S.在什么情况下会出问题呢?Flag有多个,或者是一个数组,这时候只能通过逻辑手段搞定这个问题了,多来几次空转无所谓,别出致命问题就行),因为CPU只有一个,同时访问这个标志位的只能有一个线程,而多核情况下就不太一样了,所以仅仅volatile不太能解决问题,这就要用到具体语言,具体环境中的“信号量”了,Mutex,Monitor,Lock等等,这些类都操作了硬件上的“关中断”,达到“原语”效果,对临界区的访问不被打断的效果,具体就不解释了,读者可以看看《现代操作系统》。
(2)并行计算还可以通过其他手段来获得,而多线程只是其中之一。
其他手段包括:多进程(这又包括共享存储区的和分布式多机,以及混合式的),指令级并行。
ILP(指令级并行),x86架构里叫SMT(同时多线程),在MIPS架构里与之对应的是super scalar(超标量)和乱序执行,二者有区别,但共同点都是可以达到指令级并行,这是用户没法控制的,不属于编程范围,只能做些有限的优化,而这有限的优化可能只属于编译器管辖的范畴,用户能做的甚少。
(3)典型的适于并行计算的语言
Erlang和MPI:这两个前者是语言,后者是C++和Fortran的扩展库,效果是一样的,利用多进程实现并行计算,Erlang是共享存储区的,MPI是混合型的。
C#.NET4.0:新版本4.0可以用少量代码实现并行For循环,之前版本需要用很繁琐的代码才能实现同样功能。这是利用了多线程实现并行计算。Java和C#3.5都有线程池(ThreadPool),也是不错的很好用的多线程管理类,可以方便高效的使用多线程。
CUDA,还是个初生牛犊,有很大的发展潜力,只不过就目前其应用领域很有限。其目前只能使用C语言,而且还不是C99,比较低级,不能使用函数指针。个人感觉这由于硬件上天生的局限性(平均每个核心可用内存小,与系统内存通讯时间长),只适用于做科学计算,静态图像处理,视频编码解码,其他领域,还不如高端CPU。等以后GPU有操作系统了,能充分调度GPU资源了,GPU就可以当大神了。游戏中的物理加速,实际上多核CPU也能很好的做到。

热心网友 时间:2023-10-21 14:01

理论上来说你的理解是对的 但是要看软件啊 对多线程优化好的软件 那是相当明显的比如说我用的3DSMAX 它可以运用多线程 并且可以让CPU100%满载运行 那么 i7 有八个线程 和i5 4个线程
就是我用这个软件就可以提升50%左右 向至强的CPU就更强了 主要是软件 软件可以使用多线程那么提升是相当明显的!追问

请问一般都是怎么优化的,能举个例子吗?

还有下面这段代码,为什么线程数调高了,速度反而更慢 - -!

 

追答你在百度百科上面 看看多线程 就明白了 上面写的 很详细的!

热心网友 时间:2023-10-21 14:01

线程中间有个sleep方法。
程序中有死循环而且中间没用sleep所有导致的。循环一次一定要sleep一下。要不他一直占住CPU不释放,导致程序死锁。
在线程里面加上 :
System.Threading.Thread.Sleep(10000);就能解决这个问题了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎样打开oppor8315的移动磁盘,我想下点小说都不行 op手机r8315质量好不 酷狗音乐会员怎么开通划算?不同渠道价格对比 酷狗透视卡是什么意思 装甲输送车性能 M59履带式装甲人员输送车性能数据 车厘子和草莓是寒性水果吗-车厘子和草莓是凉性的吗 我想了解国寿鑫福临门年金保险 安卓手机如何把数据迁移到iPhone13上?最详细操作方法,小白都会 BIOS里的CSM是什么啊? VC++多线程问题 C语言多线程问题:如何让下面两段代码同时运行 就是播放生日歌的同时输出文字 C++ 多线程多进程问题 C多线程参数传递问题 关于c++中多线程的问题 邮政卡在取款机转帐给平安银行要多久才到帐 C++多线程问题 我在邮政银行自动存取款机转账50000元,出夕转的,跨行转账多长时间能到账? C/C++多线程问题? 邮政储蓄银行自助取款机转账多长时间到账 在中国邮政用atm跨行转账要多久啊,我这24小时还没有到账 邮政储蓄银行 atm跨行转账到工商银行需要多长时间? Excel2013怎么设置打开密码? C语言读程序题,写程序题。给200!越快越好! c语言读程序的题? C语言程序阅读题 C 语言 程序阅读题 C语言:读程序题 C语言读程序题,高分跪求达人,在线等。程序如下: 一道c语言读程序题,求问为什么 关于c/c++中多线程的使用 请问下自动取款机跨行转账要多久到帐 word插入怎么做 苹果手机指纹没有了怎么办呀 苹果6为什么设置不了指纹? 为什么iPhone6无法录入指纹? iPhone6为什么无法添加指纹?还有那个Touch ID和密码不在设置通用里面, 为什么iPhone6录不了指纹? 如何将录屏转换为gif 如何对STM8S的闪存存储器和数据EEPROM编程 stm8s的变量tiny和near有什么区别 stm8s207是什么集成电路? stm8s单片机,掉电存储 stm8s单片机nrst脚能作输出吗 如何使用STM8S单片机的多通道AD转换 关于STM8S awu的问题 如何使用STM8S微控制器中的AD转换 STM8S系列单片机如何使用printf函数 stm8s207是什么集成电路 怎样编程操作stm8的option byte