进程(process):管理单元,管理分配应用程序的数据,代码的内存空间.
线程(thread):执行单元,线程负责执行一个预先编排好的代码段,执行代码,栈是基于线程的.
一个应用程序启动的时候,进程自动创建,并且会默认创建主线程,主线程负责执行Main()方法.
thread t =new thread(new ThreadStart(f));
f方法变量是放在t线程空间的栈中的.
thread t1=new thread(new ThreadStart(f));
f方法变量是放在t1线程空间的栈中的.
可以有无数个线程执行同一个方法.方法中的变量(局部变量)分别放在不同的线程空间当中,互不影响.
public void f()
{
int a=0;
int b=a++;
int c;
}
如session,它是基于会话的,不是全局的.所以session中的数据当前会话能看到.
浏览器向服务器发送第一个请求,随后要和服务器一系列的连续交互,这段期间是一个会话.
多个线程控制一个全局变量时候,需要用Lock
全局的变量是进程数据.
int sum=0;
public void f()
{
sum=sum+2
}
f的执行过程:[读取sum]->[sum+2]->[sum复制到全局]
如果2个子线程都在执行f方法.
t1线程执行的时候时间片到了,但t1并没有执行完f方法的整个过程,也就是说sum还等于0,这时候t2介入,t2读取sum为0,因为t1并没有更新sum,这样执行下去,,两个线程最后肯定有一个值被覆盖,sum的最终值为2.并不为4.
所以在多线程控制全局变量的情况下,在处理这些全局变量的时候,为了防止并发操作,需要用锁(Lock)来解决.也就是说,先让一个线程执行完毕之后,在让第二个线程介入.
加锁的目的是保证涉及到的全局变量的代码不会被多个线程并行的去执行.
Lock(o) //o为锁对象(实例或typeof(类名))
{
//临界区域(critical section)
sum=sum+2;
}