• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C# 线程相关知识总结

c# 搞代码 4年前 (2022-01-09) 17次浏览 已收录 0个评论

初识线程

线程是一个独立的运行单元,每个进程内部都有多个线程,每个线程都可以各自同时执行指令。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。但是对于.NET的客户端程序(Console,WPF,WinForms)是由CLR创建的单线程(主线程来源gaodaimacom搞#^代%!码网,且只创建一个线程)来启动。在该线程上可以创建其他线程。

图:

线程工作方式

多线程由内部线程调度程序管理,线程调度器通常是CLR委派给操作系统的函数。线程调度程序确保所有活动线程都被分配到合适的执行时间,线程在等待或阻止时 (例如,在一个独占锁或用户输入) 不会消耗 CPU 时间。
在单处理器计算机上,线程调度程序是执行时间切片 — 迅速切换每个活动线程。在 Windows 中, 一个时间片是通常数十毫秒为单位的区域 — — 相比来说 线程间相互切换比CPU更消耗资源。在多处理器计算机上,多线程用一种混合的时间切片和真正的并发性来实现,不同的线程会在不同的cpu运行代码。

创建线程

如:

using System;
using System.Threading;

class ThreadTest
{
 static void Main()
 {
  Thread t = new Thread (Write2);     // 创建线程t
  t.Start();                // 执行 Write2()
 
  // 同时执行主线程上的该方法
  for (int i = 0; i < 1000; i++) Console.Write ("1");
 }
 
 static void Write2()
 {
  for (int i = 0; i < 1000; i++) Console.Write ("2");
 }
}

输出

111122221122221212122221212……

在主线程上创建了一个新的线程,该新线程执行WrWrite2方法,在调用t.Start()时,主线程并行,输出“1”。

图:

线程Start()之后,线程的IsAlive属性就为true,直到该线程结束(当线程传入的方法结束时,该线程就结束)。

CLR使每个线程都有自己独立的内存栈,所以每个线程的本地变量都相互独立。

如:

static void Main() 
{
 new Thread (Go).Start();   // 创建一个新线程,并调用Go方法
 Go();             // 在主线程上调用Go方法
}
 
static void Go()
{
 // 声明一个本地局部变量 cycles
 for (int cycles = 0; cycles < 5; cycles++) Console.Write ('N');
}

输出

NNNNNNNNNN (共输出10个N)

在新线程和主线程上调用Go方法时分别创建了变量cycles,这时cycles在不同的线程栈上,所以相互独立不受影响。

图:

如果不同线程指向同一个实例的引用,那么不同的线程共享该实例。

如:

class ThreadTest
{
 //全局变量
 int i;
 
 static void Main()
 {
  ThreadTest tt = new ThreadTest();  // 创建一个ThreadTest类的实例
  new Thread (tt.Go).Start();
  tt.Go();
 }
 
 // Go方法属于ThreadTest的实例
 void Go() 
 {
   if (i==1) { ++i; Console.WriteLine (i); }
 }
}

输出

2

新线程和主线程上调用了同一个实例的Go方法,所以变量i共享。

静态变量也可以被多线程共享

class ThreadTest 
{
 static int i;  // 静态变量可以被线程共享
 
 static void Main()
 {
  new Thread (Go).Start();
  Go();
 }
 
 static void Go()
 {
  if (i==1) { ++i; Console.WriteLine (i); }
 }
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C# 线程相关知识总结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址