AI智能
改变未来

C#多线程随笔


什么是进程?

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。在Windows中进程是十分昂贵的,创建一个进程通常要花费好几秒。

什么是线程?

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。创建线程的代价相对较低,但是应该还是要使用得当。

什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务,多线程实际上就是资源换性能。

多线程的好处是什么?

可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。Cpu在执行一个线程前会先访问cache如果线程代码和数据在cache中就不会去访问Ram。如果执行的新线程不在cache中那么cpu将更新cache恢复高速执行状态。一个时间片结束,如果继续运行同一个线程,那么windows不会执行上下文切换,相反线程将继续运行,显著改进性能。

多线程的不利方面有哪些?

1.多线程会引起上下文切换,上下文切换通过牺牲性能换来好的用户体验,但上下文切换产生性能影响,切换一个线程时会产生一定性能损失。上下文切换所需时间取决于cpu架构和速度,但尽量避免上下文切换。

2.执行垃圾回收时候,CLR必须挂起所有线程。线程越多调试体验越差。

3.多线程需要协调和管理,所以需要CPU时间跟踪线程。

4.线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。

5.线程太多会导致控制太复杂,最终可能造成很多Bug。

什么时候使用多线程?

多线程特点主要表现在:不卡主线程、速度快、无序性,使用多线程可以提高客户端(如winform)的可响应性,在某些情况下一个任务可以拆分成多个线程同时进行,这样可以提升性能。是多线程并不是提升性能的万金油,盲目使用多线程不能提升性能还会增加线程开销,执行垃圾回收时候,CLR必须挂起所有线程,线程越多调试体验越差。

多线程一般几个最好?

如果只关心性能,最优的线程数就是机器CPU数目,理由是如果线程数超过了CPU的数目,就会产生上下文切换的性能损失,如果每个cpu只有一个线程,就不会有上下文切换,当然这在实际生活生产环境中是不合理的。

目前在其他博客中会看到一些观点,比如例如:CPU 密集型程序

的最合适程数应该是:CPU 核数(逻辑)+ 1,

I/O密集型程序合适: 最佳线程数 =

CPU核心数

*

(1/CPU利用率)

=

CPU核心数

*

(1 + (I/O耗时/CPU耗时))。但是我想指出一点,他们所谓的最佳只是让CPU在理论上达到100%的利用率,可是100%利用率真的是最佳吗?CPU利用率本身就不是一个硬性指标,并不是越高越好,我相信并不会有某个公司会让让一台服务器长时间保持在100%的CPU的利用率。所以多线程一般几个最好这个问题,这个问题的本身就是个问题。(这个是本人见解,可能有不合理之处,欢迎大家在评论区讨论)

 

 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » C#多线程随笔