C# 线程同步详解线程同步详解
前言前言
当线程池的线程阻塞时,线程池会创建额外的线程,而创建、销毁和调度线程所需要相当昂贵的内存资源,另外,很多的开发
人员看见自己程序的线程没有做任何有用的事情时习惯创建更多的线程,为了构建可伸缩、响应灵敏的程序,我们在前面介绍
了C#异步编程详解
但是异步编程同样也存在着很严重的问题,如果两个不同的线程访问相同的变量和数据,按照我们异步函数的实现方式,不可
能存在两个线程同时访问相同的数据,这个时候我们就需要线程同步。多个线程同时访问共享数据的时,线程同步能防止数据
损坏,之所以强调同时这个概念,因为线程同步本质就是计时问题。
异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事
件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程
不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。
基元用户模式和内核模式构造基元用户模式和内核模式构造
基础概念基础概念
基元:可以在代码中使用的简单的构造
用户模式:通过特殊的CPU指令协调线程,操作系统永远检测不到一个线程在基元用户模式的构造上阻塞。
内核模式:由windows自身提供,在应用程序的线程中调用由内核实现的函数。
用户模式构造用户模式构造
易变构造易变构造
C#编译器、JIT编译器和CPU都会对代码进行优化,它们尽量保证保留我们的意图,但是从多线程的角度出发,我们的意图并
不一定会得到保留,下面举例说明:
static void Main(string[] args)
{
Console.WriteLine("让worker函数运行5s后停止");
var t = new Thread(Worker);
t.Start();
Thread.Sleep(5000);
stop = true;
Console.ReadLine();
}
private static bool stop = false;
private static void Worker(object obj)
{
int x = 0;
while (!stop)
{
x++;
}
Console.WriteLine("worker函数停止x={0}",x);
}
评论0
最新资源