1、多线程
进程:一般指程序中运行的程序,实际作用是为程序在执行过程中创建好所需要的环境和资源
线程:是进程的一个实体,是cpu用来调度执行程序的最小单元,一个进程可以拥有多个线程
单线程:进程中只有一个线程,只执行一个线程。
多线程:同一时刻,可以执行多个线程
并发:一段时间内,同时做多件事情
并发是同一时刻,只能执行一个线程,但是多个线程被快速的交替执行,使得在宏观上有了多线程同时执行的假效果,但是在微观上并不是同时执行的,只是把时间分成若干段,使得多个线程快速的交替执行
并行:同一时刻,做多件事儿
指在同一时刻,有多个线程在多个处理器上同时执行,无论从宏观还是微观来看,这些线程都是一起执行的
同步:等待前一个任务结束后,再执行下一个任务,无并发或者并行概念
异步:多个任务,同时执行。并发&并行
Thread th = new Thread();
th.State();通知cpu,准备完成可以随时执行。并不是马上执行。
Thread.Sleep(暂停的时间);阻塞当前线程
th.Join();Join和Sleep一样,都会阻塞当前线程,Join是用线程对象自己来阻塞的。
线程状态控制的方法包括暂停线程 (Sleep)、中断线程 (Interrupt)、挂起线程 (Suspend)、唤醒线程 (Resume)、终止线程 (Abort)。
优先级的值通过 ThreadPriority枚举类型来设置,从低到高分别为Lowest、BelowNormal、Normal、AboveNormal、Highest。
线程的生命周期:出生、就绪、正在执行、暂停、结束
Thread.Sleep(0);交出cpu的调度权限,给更高的优先级
Thread.Sleep(1);交出cpu的调度权限,给任意的优先级
2、多线程异步的三大特征
可见性:当多个线程访问同一个变量时,一个线程修改了这个变量值,其他线程能够立即看到修改后的值
原子性:即一个操作或者多个操作,要么全部执行(执行的过程中不被任何因素打断),要么就都不执行
有序性:即程序的执行按照代码的先后顺序执行。
Private static object o = new object();
Monitor.Enter(o);
执行的语句;
Monitor.Exit(o);//互斥锁
=>
lock(0)
{
执行的语句;
}
Interlocked.Increment(ref number);
在有锁的情况下执行递增
volatile关键字指示一个字段可以由多个同时执行的线程修改。声明为 volatile的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。
volatile修饰符通常用于由多个线程访问、但不使用lock语句对访问进行序列化的字段。
3、死锁
互斥性:当一个资源被线程使用的时候,别的线程不能使用。
不可抢占性:资源请求者不可强制从资源拥有者中抢夺资源。
占有且等待性:资源请求者在等待其他资源时,保持多原有资源的占有。
循环等待性:线程1等待线程2占有的资源,线程2等待线程1占有的资源。
4、AutoResetEvent和ManualResetEvent
ManualResetEvent表示线程同步事件,事件在一个等待线程释放后收到信号时自动重置
AutoResetEvent表示线程同步事件,收到信号时,必须手动重置该事件。此类不能被继承。
1. WaitOne:
当线程调用WaitOne方法时,它会进入等待状态,直到接收到信号。
如果AutoResetEvent处于无信号状态,WaitOne方法将阻塞线程的执行。
如果AutoResetEvent处于有信号状态,WaitOne方法将消耗该信号,并使AutoResetEvent重新进入无信号状态。
可以通过WaitOne 的重载方法指定超时时间,在超过指定时间后,线程将继续执行而不等待信号。
2.Set:
当线程调用Set方法时,它会将AutoResetEvent 的状态设置为有信号。
如果有线程正在等待信号,它将被唤醒并开始执行。
如果没有线程在等待信号,调用Set方法也会将AutoResetEvent的状态设置为有信号,但不会有任何其他影响。即使多次调用Set方法,AutoResetEvent也只会保持有信号状态一次,直到被消耗。
5、异步编程模型
APM:异步编程模型(Asynchronous Programming Model),这是使用IAsyncResult接口提供异步行为的旧模型。在这种模式下,同步操作需要Begin和End方法(例如,BeginWrite和EndWrite以实现异步写入操作)。
EAP:基于事件的异步编程模式(Event-based Asynchronous Pattern),是提供基于事件的异步行为的旧模型。这种模式需要后缀为Async的方法,以及一个或多个事件、事件处理程序委托类型和EventArg派生类型。
TAP:基于任务的异步编程模式(Task-based Asynchronous Pattern),该模式使用单一方法表示异步操作的开始和完成。