C#线程和进程

https://blog.csdn.net/weixin_42446849/article/details/81206577

什么是进程?
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。

一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。

什么是线程?
线程是操作系统分配处理器时间的基本单元,也是一个独立的运行单 元,每个进程内部都有多个线程,每个线程都可以各自同时执行指令。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。但是对于.NET的客户端程序(Console,WPF,WinForms)是由CLR创建的单线程(主线程,且只创建一个线程)来启动。在该线程上可以创建其他线程。

用一个通俗的例子讲就是,一个进程相当于一个工厂,线程就是一个个的车间,工厂(进程)由多个车间(线程)组成,并包含车间(线程)所需的一切资源。工厂(进程)的工作其实就是依赖于车间(线程)的工作。

Thread类:
通过Thread类我们可以发起一个线程

构造函数:
Thread(ThreadStart method);//无参无返回值类型的方法Thread(ParameterizedThreadStart method)//无返回值类型,有一个object参数的方法

属性:
static CurrentThread:返回当前正在运行的线程

Name:设置/返回线程的名字

IsBackground:是否是后台线程

Priority设置优先级的

方法:
Start()启动线程,调用无参无返回值的函数

Start(Object pram)启动线程,pram传参给有参数的方法;

static Sleep(int 毫秒)让线程休眠,处于暂停执行的状态

Abort()终止线程

Join(int 毫秒);挂起(暂停)正在调度的线程,直到被调度的线程执行完毕后,该线程才继续执行

代码示例:

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......
线程优先级
系统优先执行优先级较高的线程,但这只意味着优先级较高的线程占有更多的CPU时间,并不意味着一定要先执行完优先级较高的线程,才会执行优先级较低的线程。

代码示例:

static void Main(string[] args)
{
Thread thA = new Thread(A); Thread thB = new Thread(B);
//线程优先级
thA.Priority = ThreadPriority.AboveNormal; thB.Priority = ThreadPriority.BelowNormal;
 
thA.Start();
thB.Start();
 
}
static void A() {
for (var i = 0; i < 100; i++) { Console.Write("A");
}
}
static void B()
{
for (var i = 0; i < 100; i++)
{
Console.Write("B");
}
}
同步锁:https://www.cnblogs.com/wolf-sun/p/4209521.html
lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待

(即被阻止),直到该对象被释放。

lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。

 在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。 

打个比方,有这样一个情景,很多公司所在的大厦的厕所的蹲位都是小单间型的,也就是一次只能进去一个人,那么为了避免每次进去一个 人,那怎么做呢?不就是一个人进去之后顺手把门锁上么?这样你在里面干啥事,外边的人也只能等待你解放完了,才能进入。而蹲位的资源

(蹲位,手纸等)是共享的。常用的锁的格式如下:

private static readOnly Object lockObj=new Object(); lock(lockObj){
//执行代码

}

相 当 于 : Monitor.Enter(lockObj); 代 码 块 ; Monitor.Exit(lockObj);

总结:
1.0 线程的和进程的关系以及优缺点
windows系统是一个多线程的操作系统。一个程序至少有一个进程,一个进程至少有一个线程。进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程。例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的。它的功能主要是产生新的线程和执行程序。C#是一门支持多线程的编程语言,通过

Thread类创建子线程,引入using System.Threading命名空间。

多线程的优点:
1、 多线程可以提高CPU的利用率,因为当一个线程处于等待状态的时候,CPU会去执行另外的线程

2、 提高了CPU的利用率,就可以直接提高程序的整体执行速度

多线程的缺点:
1、线程开的越多,内存占用越大

2、协调和管理代码的难度加大,需要CPU时间跟踪线程

3、线程之间对资源的共享可能会产生可不遇知的问题

线程的状态

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值