当前位置: 首页 > article >正文

C# 独立线程

文章目录

    • 前言
      • 使用多线程注意事项:
        • 1.线程安全性:
        • 2.线程同步:
        • 3.避免主线程的耗时操作:
        • 4.使用线程池:
        • 5.注意线程的生命周期管理:
        • 6.正确处理线程间通信:
        • 7.考虑线程的优先级和调度:了解操作系统对线程的调度策略,合理设置线程的优先级,确保关键线程能够优先执行。
        • 8.异常处理:
  • 一、 线程的概念
    • 1.1 进程(Process)
    • 1.2 线程(Thread)
    • 2. 线程的状态
    • 3. 线程的优势
    • 4. 线程的劣势
  • 二、代码举例
    • 1. 创建和启动线程
    • 2. 停止线程
    • 3. 线程同步
    • 4. 线程间通信
    • 5. 线程优先级
    • 6. 异步编程
    • 7. 线程池
    • 三.创建4个简易独立线程
  • 总结


前言


使用多线程注意事项:

1.线程安全性:

多线程编程中,由于线程共享内存空间,因此需要注意线程安全性。如果多个线程同时访问和修改同一份数据,可能会导致数据不一致或出现竞态条件。为了确保线程安全,可以使用同步机制,如互斥锁(mutex)、条件变量、信号量等来控制对共享数据的访问。

2.线程同步:

线程同步是确保线程间有序执行的关键。通过同步机制,可以防止多个线程同时访问共享资源,造成数据混乱或死锁。

3.避免主线程的耗时操作:

主线程通常负责处理用户界面更新等任务,如果主线程被耗时操作阻塞,会导致用户界面卡顿。因此,应避免在主线程中执行耗时操作,如网络请求、数据库操作等,而应将这些操作放到子线程中执行。

4.使用线程池:

使用线程池可以复用线程,减少线程的创建和销毁开销,提高应用性能。线程池中的线程可以根据需要动态创建和销毁,有效管理资源。

5.注意线程的生命周期管理:

当不再需要线程时,应及时停止线程,释放相关资源,避免线程泄漏。

6.正确处理线程间通信:

在多线程编程中,线程间可能需要通过共享变量、消息队列等方式进行通信。确保通信的安全性和正确性,避免竞态条件或死锁。

7.考虑线程的优先级和调度:了解操作系统对线程的调度策略,合理设置线程的优先级,确保关键线程能够优先执行。
8.异常处理:

多线程编程中,线程间的异常处理尤为重要。应确保线程能够妥善处理异常情况,避免程序崩溃或数据损坏。

一、 线程的概念

1.1 进程(Process)

定义:进程是操作系统进行资源分配的基本单位,每个进 程拥有独立的内存空间和系统资源。
特点:
每个进程有一个唯一的进程标识符(PID)。
进程之间相互独立,互不影响。
进程之间的通信通常需要通过进程间通信(IPC)机制,如管道、消息队列、共享内存等。

1.2 线程(Thread)

定义:线程是进程内的执行单元,是操作系统能够进行运算调度的最小单位。
特点:
同一个进程内的线程共享该进程的内存空间和资源。
线程之间的通信和同步相对简单,因为它们共享相同的内存空间。
线程的创建和切换开销比进程小得多。

2. 线程的状态

线程在其生命周期中会经历不同的状态。常见的线程状态包括:

+-----------------+
|     新建         |
|  (New)          |
+-----------------+
          |
          v
+-----------------+
|     就绪         |
|  (Ready)        |
+-----------------+
          |
          v
+-----------------+
|     运行         |
|  (Running)      |
+-----------------+
          |   \
          |    \
          |     \ (等待资源)
          v      v
+-----------------+  +-----------------+
|     阻塞         |  |     阻塞         |
|  (Blocked)      |  |  (Waiting)      |
+-----------------+  +-----------------+
          |                 |
          | (资源可用)       | (条件满足)
          v                 v
+-----------------+  +-----------------+
|     运行         |  |     运行         |
|  (Running)      |  |  (Running)      |
+-----------------+  +-----------------+
          |                 |
          v                 v
+-----------------+  +-----------------+
|     终止         |  |     终止         |
|  (Terminated)   |  |  (Terminated)   |
+-----------------+  +-----------------+

图解说明

  • 新建 (New):
    线程对象已创建,但尚未调用 Start 方法。
    线程还没有开始执行。
  • 就绪 (Ready):
    线程已准备好运行,但由于其他线程正在运行而等待调度。
    线程处于可运行状态,等待 CPU 调度。
  • 运行 (Running):
    线程正在 CPU 上执行。
    线程可以执行其任务。
  • 阻塞 (Blocked):
    线程在等待某个条件满足(如资源可用)之前无法继续执行。
    例如,线程可能在等待 I/O 操作完成或等待锁的释放。
  • 等待 (Waiting):
    线程在等待某个特定条件满足(如事件发生)之前无法继续执行。
    例如,线程可能在等待 Monitor.Wait 或 WaitHandle.WaitOne。
  • 终止 (Terminated):
    线程执行完毕或由于某种原因被终止。
    线程不再执行任何任务,资源被释放。
  • 转换关系
    新建 -> 就绪:调用 Start 方法后,线程从新建状态进入就绪状态。
    就绪 -> 运行:当 CPU 调度到该线程时,线程从就绪状态进入运行状态。
    运行 -> 阻塞/等待:线程在等待资源或特定条件时,从运行状态进入阻塞或等待状态。
    阻塞/等待 -> 运行:当资源可用或条件满足时,线程从阻塞或等待状态重新进入运行状态。
    运行 -> 终止

http://www.kler.cn/a/386572.html

相关文章:

  • Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • javaWeb小白项目--学生宿舍管理系统
  • Suricata
  • React Native 全栈开发实战班 - 核心组件与导航
  • js中typeOf无法区分数组对象
  • 【Qwen2技术报告分析】解读模型架构 pre/post数据构建和模型评估
  • [Android] Graphic Buffer 的申请
  • C++:线程(thread)的创建、调用及销毁
  • Halcon resistor.hedv 使用多个对焦级别提取深度
  • .NET 黑名单上传 突破WAF防护的SoapShell (免杀版)
  • MySQL数据库专栏(五)连接MySQL数据库C API篇
  • Unity3D ASTC贴图压缩格式详解
  • MacOs上如何彻底卸载DevEco Studio?
  • VSCode 多工程联合调试
  • PythonBase02
  • MFC图形函数学习06——画椭圆弧线函数
  • EDUCODER头哥 SpringBoot 异常处理
  • UE5.4 PCG 自定义PCG蓝图节点
  • memcache redis区别
  • 【Java项目】基于SpringBoot的【时间管理系统】
  • 选项式api和组合式api
  • 【如何获取股票数据40】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深指数最新分时KDJ数据获取实例演示及接口API说明文档
  • input file检验成功之后才可以点击
  • 网络--应用层协议--HTTP
  • Go语言死锁和阻塞