0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

掌握多线程技术

li5236 来源:dotNet工控上位机 作者:dotNet工控上位机 2022-03-29 14:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

初学者学习编程时,很容易因为多线程出现各种问题,导致不敢使用多线程。但是多线程技术在做开发中,是不可忽视的一个技术,基本上我们实际应用中,每个项目都会使用多线程,所以多线程技术必须掌握。

为什么要用多线程

随着工业的进步,现在的笔记本、台式机大都是双核的,4核、8核甚至16核,也很常见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。

单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。

多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。

如果你做项目不使用多线程,不仅是技术的问题,也是对电脑资源的极大浪费,就像你买了一辆配置非常高的越野车,你仅仅只用它来日常代步一样。3

为什么不敢用多线程

之前跟一些学员沟通时发现,很多学员之所以不敢使用多线程,是因为之前出过问题,有种“一朝被蛇咬,十年怕井绳”的感觉。

为什么多线程容易出问题,有个主要的原因在于多线程充满着“未知性”,有的人使用时,发现代码并没有按照预想的流程在走,这其实是正常的。

我们必须要明确一点,多线程确实是“不可控的”,有某种意义上来说,多线程是靠CPU调度来执行的,并非人为去控制。

我们所谓的控制多线程,仅仅是.NET框架开放了一些接口开发者,这样可以相对性地间接控制多线程的启动停止暂停继续。

线程的启动停止

线程的启动停止,从.Net Framework 4.5开始,Task提供了一个叫CancellationTokenSource的对象,可以使用它来对多线程的启停进行控制。

首先,我们做一个线程任务,这个任务很简单,只是不断操作某个变量,每0.1秒加1,到一定值之后,重置为0,然后将这个值显示在界面上,界面如下所示:

pYYBAGJCommAHohAAAEBK_S4MA8205.png

所以任务方法如下:

poYBAGJCommAUQsFAAFCzNteiYk911.png

个对象就是CancellationTokenSource的对象,因此我们需要创建一个CancellationTokenSource对象cts:

pYYBAGJCommAeFBDAAByrWJa05o840.png

然后在启动线程按钮的事件里,编写代码如下:

poYBAGJCommALjvEAAC33LkZg20419.png

停止线程按钮的事件里,只需要调用cts的Cancel方法即可:

pYYBAGJCommAfnHqAACJjBQEKQs412.png

其实,说白了,就是通过cts来控制cts的IsCancellationRequested属性,进而实现多线程的控制。

线程的暂停继续

多线程的暂停继续,.NET为我们提供了另外一个对象——ManualResetEvent,这个对象会有一个值,这个值是布尔类型,就像一个门闸一样,True是打开门闸,False是关闭门闸,所以想要暂停多线程就调用这个对象的Reset方法,想要继续多线程就调用这个对象的Set方法,使用非常简单。

首先我们创建一下这个对象,可以通过构造方法,给这个对象赋初始值,我这里为True,这样就能直接运行,不会阻塞。

poYBAGJCommAFYwjAACT6iBUZqo649.png

但是如果希望这个对象与多线程有所联系,必须要在多线程的方法里体现这个对象的作用,这个是调用这个对象的WaitOne方法,表示在调用的地方阻塞住,通过判断True或者False来决定是否继续执行,就像大家开车过高速收费站一样,即使现在普遍采用ETC了,在入口也需要减速,有一个ETC识别的过程,识别成功才会抬杆,识别识别,杆子是不会自动抬起的,这个是一样的道理。

所以线程执行代码如下:

pYYBAGJComqAQ0XgAACDmtYVuHw124.png

对比一下,其实就是加了一个manual.WaitOne()。

线程暂停代码:

poYBAGJComqAWj-YAAAuPKiIW90610.png

线程继续代码:

pYYBAGJComqACdzRAAB-g448phs190.png

AutoResetEvent

AutoResetEvent和ManualResetEvent的用法非常相似,区别在于一个是手动,一个是自动,AutoResetEvent会在置位之后自动复位,这样体现在多线程里,就是会只执行一次,就像大家进小区一样,如果有10辆车在排队,这时候如果自动模式,每次只能进一辆车,如果是手动模式,可以由保安控制门闸打开,等10辆车都进去之后,再由保安将门闸关注。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20915
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73154
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    多线程的系统

    多线程系统的事件响应也是在中断中完成的,但事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执
    发表于 12-08 07:55

    嵌入式应掌握的几种能力

    RT-Thread等。学习操作系统内核知识:线程调度、时钟管理、线程间同步、线程间通信、内存管理、设备管理等,并掌握基本的使用。 再熟悉Linux操作系统的基本使用。 再学习Lin
    发表于 12-08 06:05

    Linux多线程对比单线程的优势

    :「资源利用率」:通过多线程,可以更有效地利用CPU资源,特别是多核CPU。「并行处理」:线程允许同时执行多个任务,提高程序的执行效率。「简化设计」:使用线程可以简化程序设计,因为线程
    发表于 12-01 06:11

    摩尔线程亮相GOTC 2025全球开源技术峰会

    近日,以“万源共振,智构未来”为主题的GOTC 2025全球开源技术峰会在北京成功举办。本届峰会汇聚了国内外顶尖技术专家、企业代表与开源社区领袖,共同探讨开源与AI深度融合带来的创新路径与发展机遇
    的头像 发表于 11-04 10:43 1631次阅读

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    【HZ-T536开发板免费体验】—— linux创建线程

    自己的私有资源。 在linux系统中,线程状态通常反映了当前线程的当前活动和执行阶段。 主要分为: 1。运行转态 2。阻塞转态 3。终止状态 如何区分单线程多线程? 在单个程序中只
    发表于 09-01 21:31

    【RA4E2开发板评测】LED1及LED2轮流点亮并同时亮8秒,体验FreeRTOS多线程

    我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个
    发表于 08-24 17:24

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作线程中导
    发表于 06-20 07:49

    工控一体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 487次阅读

    2.4 GHz 前端模块 (FEM),用于 Zigbee 技术线程和设备,具有适合蓝牙®应用的端口 skyworksinc

    电子发烧友网为你提供()2.4 GHz 前端模块 (FEM),用于 Zigbee 技术线程和设备,具有适合蓝牙®应用的端口相关产品参数、数据手册,更有2.4 GHz 前端模块 (FEM),用于
    发表于 05-15 18:30
    2.4 GHz 前端模块 (FEM),用于 Zigbee <b class='flag-5'>技术</b>、<b class='flag-5'>线程</b>和设备,具有适合蓝牙®应用的端口 skyworksinc

    一种实时多线程VSLAM框架vS-Graphs介绍

    针对现有VSLAM系统语义表达不足、地图可解释性差的问题,本文提出vS-Graphs,一种实时多线程VSLAM框架。该方案显著提升了重建地图的语义丰富度、可解释性及定位精度。实验表明
    的头像 发表于 04-19 14:07 732次阅读
    一种实时<b class='flag-5'>多线程</b>VSLAM框架vS-Graphs介绍

    进程、线程、协程傻傻分不清?一文带你彻底扒光它们的\"底裤\"!

    各位程序员朋友(和假装懂技术的同事):如果你在面试时被问到:\"请用奶茶店类比进程、线程和协程\",而你回答:\"进程是老板,线程是员工,协程是兼职...\"
    发表于 03-26 09:27

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个任务,一个是I/O密集型
    发表于 03-11 06:57

    请问rt-thread studio如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗
    发表于 02-19 08:30

    华为云 X 实例 CPU 性能测试详解与优化策略

      2.2 Sysbench单线程CPU性能测试   2.3 Sysbench多线程CPU性能测试(4线程)   2.4 高强度多线程CPU性能测试(8
    的头像 发表于 12-30 14:52 1200次阅读
    华为云 X 实例 CPU 性能测试详解与优化策略