thread.join 多线程join的原理
一、为什么用begin不用join
begin和join都是用来启动线程的,但是它们之间有一点区别:begin会立即创建线程,而join会等待线程中的任务完成之后再创建线程。
因此,一般情况下,建议使用begin来创建线程,而不要使用join,因为join会引起程序的延迟,影响程序的性能。
二、多线程join的原理
多线程的join原理是:当一个线程调用了另一个线程的join方法时,该线程将会等待(即进入等待状态)另一个线程执行完毕,然后再继续执行。
具体来说,当一个线程调用了另一个线程的join方法时,被调用的线程会进入等待状态,直到调用join方法的线程执行完毕或者抛出异常。当被调用的线程结束时,会唤醒调用join方法的线程。
三、C语言中Thread与Task有什么区别
Thread是C#中最早的多线程模型,后来才推出的Task。微软推出Task的目的,就是要替代Thread,给程序员们提供一种更科学的线程模型。
ThreadThread是基于delegate的早期线程模型。
固定参数的delegate
支持线程的常规操作,如Start,Join,Abort,Interrupt,Suspend,Resume等等。
使用Thread可以完成大部分的常规线程操作。虽然Thread不如Task强大,但是Thread也有一个使用得非常广泛的API:
Thread.Sleep
尽管设计得好的多线程程序,完全不需要显式地Sleep!
另外,刚才用.NetFramework4.7.2创建了一个项目,看了看Thred的API,居然也支持了Yield:
Thread.Yield
更有ResetAbort这种操作:
Thread.ResetAbort
真是不用Thread久已!
TaskTask是基于Action,Func的更加现代的线程模型。支持模板参数,比Thread中的固定参数delegate,在进行数据传递的时候,要更加灵活。
基于Action
Task采用了和ThreadPool类似的调度策略,但是Task在多核心CPU中在表现,要比ThreadPool更好。
在单核心CPU上执行的时候,Thread和Task基本没有太大区别。
Task在线程的控制方面,有更加强大的API支持:
Task通过CancellationToken支持一种线程的取消机制
Task支持Delay操作
Task提供了更完善的异常处理机制
Task自带线程工厂,方便随时创建Task
Task支持WaitWaitAnyWaitAll
Task支持WhenAnyWhenAll
Task支持ContinueWith,节省线程开销
Task支持Yield操作
Task通过TaskScheduler可以支持线程队列
Task还可以配合async和await关键字,写出更优雅的多线程程序,用过的人才知道有多香!
。。。。。。
总之,Task是更加现代的线程管理模型,推荐优先使用Task。
后续我将专门写一批C#中线程相关的文章,欢迎关注:
《C#中多线程的那点事儿-Thread入门》
《C#中多线程的那点事-多线程的代价》
《C#中多线程的那点事-线程池》
《C#中多线程的那点事-锁》
《C#中多线程的那点事-死锁》
。。。。。。