相信很多人在实际开发中是不愿使用到多线程的,因为一旦引入多线程这个概念,对应功能就需要加很多关于线程的考虑措施,如锁,任务回调顺序等等。有事加了一些对应的措施,还是感觉程序出现偶发的不同问题,这里主要记录一下多线程任务时需要注意的一些毫秒相关的事情。

 for (int i = 0; i < 8; i++)
{
Thread.Sleep(1000);
Console.WriteLine($"{DateTime.Now.ToString("mm:ss.fff")},i={i}");
}

这段代码模拟一个循环执行8次的任务,实际可能可能有一些功能会和这个比较类似,如设备模块初始化,一些耗时计算等等。

Console.WriteLine作为记录一个任务执行结束的时间记录

单线程时i的输出顺序还是正常的,同时这种多批次任务时会发现耗时还是比较久的,所以会考虑到异步如await anysc,task,thread等待,这里以task为例

for (int i = 0; i < 8; i++)
{
Task.Run(() =>
{
Thread.Sleep(1000);
Console.WriteLine($"{DateTime.Now.ToString("mm:ss.fff")},i={i}");
}); }

如果i作为传递的运算参数,就会发现调试运算时i产生莫名奇妙的问题,如顺序错乱,i值异常等等,如

  通过输出i会发现i清一色的为8,我这里还只是比较简单的输出i,如果此时i作为比较重要的运算参数就会使程序产生莫名其妙的逻辑问题,这里主要是因为线程它的执行逻辑不是立即触发。

在底层逻辑中他也是以任务的方式存放在线程池中,在处理器有空余的核心时才会分配任务执行的资源。甚至说for循环次数都执行完毕分出去的8个任务还没有一个开始执行,此时多线程同时访问变量 i,可能会导致闭包问题,因为每个线程都在访问相同的 i 变量。当线程在访问 i 变量时,可能会发生 i 的值在迭代过程中已经发生了变化,这可能会导致输出的 i 值不是期望值

改进措施

for (int i = 0; i < 8; i++)
{
int value = i;
Task.Run(() =>
{
Thread.Sleep(1000);
Console.WriteLine($"{DateTime.Now.ToString("mm:ss.fff")},i={value}");
});
}

  此时通过在循环内部创建一个局部变量 value,并将 i 的值赋给它,可以确保每个线程都使用正确且的 i 值。但是这样同时就会伴随一个task任务时间执行顺序错乱的问题如

这里我使用datetime输出时间精细度只能到微秒,但是还是能感知到cpu分配核心处理资源的时间不是一样的,想看更细的时间颗粒度,可以转换成ticks去输出感知。

此时如果我们因为耗时任务想要减少耗时,从而同时派出8个任务,还需要他们按照顺序回来但是因为任务执行时间的不统一,所以在任务执行完毕的关键点需要以排队的形式接收分配出去任务的返回结果,从而减少多任务带来的耗时与多线程带来的数据错乱。

最后,既然上面都观察到时间精细到微秒的误差了,可以跳转到第一个单一线程执行任务图

  第一次任务执行时间精确到毫秒是656,但最后一次执行结果时间为729,设计层面中执行8次任务设计的任务耗时都是1000ms,在最后一次执行毫秒刻度也应该与第一次保持一致都为656,但是由于cpu核心分配资源调度问题从而产生了一些时间刻度的误差。

这种时间误差可能在绝大部分时间都不需要考虑,但是牵扯到一些精细化的数据,此时的误差就是比较重要的问题了。任务的性能,耗时都需要一个比较好的解决方案了。

C# 线程相关一点杂记的更多相关文章

  1. 进程 & 线程相关知识

    不管Java,C++都有进程.线程相关的内容.在这里统一整理吧. Python的线程,其实是伪线程,不能真正的并发.下面也有讲. 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序 ...

  2. 浅谈C#中的 async await 以及对线程相关知识的复习

    C#5.0以后新增了一个语法糖,那就是异步方法async await,之前对线程,进程方面的知识有过较为深入的学习,大概知道这个概念,我的项目中实际用到C#异步编程的场景比较少,就算要用到一般也感觉T ...

  3. Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程

    一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. ​ threadin ...

  4. iOS开发Swift篇(02) NSThread线程相关简单说明

    iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...

  5. 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明

    李洪强iOS开发Swift篇---12_NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThre ...

  6. Singleton模式线程相关的(C\C++)

    这种需求的最新发展. 我需要一个静态类,无论地方,我可以在线程中调用它public功能对应的功能已经完成. 这个静态类会调用我初始化给它的一个指针,这个指针是与线程一一相应的: 准确来说这样的模式应该 ...

  7. java线程相关

    java线程相关 java 线程 1 线程的状态 This is an example of UML protocol state machine diagram showing thread sta ...

  8. Java线程相关的热门面试题

    ---恢复内容开始--- 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...

  9. Qt 学习之路 2(73):Qt 线程相关类

    Home / Qt 学习之路 2 / Qt 学习之路 2(73):Qt 线程相关类 Qt 学习之路 2(73):Qt 线程相关类  豆子  2013年11月26日  Qt 学习之路 2  7条评论 希 ...

  10. 【旧文章搬运】Windows内核常见数据结构(线程相关)

    原文发表于百度空间,2008-7-24========================================================================== 线程是进程的 ...

随机推荐

  1. vue3 基础-补充 ref & provide-inject

    本篇主要对一些被以前内容(渲染, 传值) 等忽略的几个常用小技巧进行补充说明啦. v-once 即对某个dom节点生效, 其会限定只会渲染一次, 不论数据是如何的变化, 演示如下: <!DOCT ...

  2. Google Cloud Next大会上的耀眼新星:探索最具潜力的AI初创公司

    在拉斯维加斯举办的Google Cloud Next大会上,不仅揭晓了如Ironwood处理器和Gemini 2.5 Flash等重磅新技术,还展示了一系列使用谷歌云计算服务的最有趣的初创公司.这些创 ...

  3. AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题

    问题:未能加载文件或程序集"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aee ...

  4. 基于First Order Motion与TTS的AI虚拟主播系统全流程实现教程

    前言:多模态虚拟主播的技术革命 在AI内容生成领域,虚拟主播技术正经历从2D到3D.从固定模板到个性化定制的跨越式发展.本文将深入解析如何通过Python技术栈构建支持形象定制与声音克隆的AI虚拟主播 ...

  5. c语言笔记(翁凯男神

    哼,要记得好好学习去泡帅哥吖 一.快速入门 %p 输出地址 #include <stdio.h> void f(int *p); int main(){ int i = 1; printf ...

  6. 极简版闹钟(java)

    package javaBasic; import java.awt.Toolkit; import java.awt.event.*; import java.text.SimpleDateForm ...

  7. React Native开发鸿蒙Next---图片浏览与保存的问题交流

    React Native开发鸿蒙Next---图片浏览与保存的问题交流 之前介绍过利用鸿蒙三方RN组件@react-native-camera-roll/camera-roll保存图片到相册. Rea ...

  8. 【中英】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第三周测验

    [中英][吴恩达课后测验]Course 2 - 改善深层神经网络 - 第三周测验 上一篇:[课程2 - 第二周编程作业]※※※※※ [回到目录]※※※※※下一篇:[课程2 - 第三周编程作业] 第3周 ...

  9. SwanLab入门深度学习:Qwen3大模型指令微调

    一.概述 Qwen3是通义千问团队的开源大语言模型,由阿里云通义实验室研发.以Qwen2作为基座大模型,通过指令微调的方式实现高准确率的文本分类,是学习大语言模型微调的入门任务. 指令微调是一种通过在 ...

  10. Error creating bean with name 'xxx' defined in file异常处理

    SpringBoot整合mybatis 今天在使用mybatis generator时遇到一个坑,出现以下错误 Error creating bean with name 'authorizeCont ...