99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

掌握多線程技術(shù)

li5236 ? 來(lái)源:dotNet工控上位機(jī) ? 作者:dotNet工控上位機(jī) ? 2022-03-29 14:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

初學(xué)者學(xué)習(xí)編程時(shí),很容易因?yàn)槎嗑€程出現(xiàn)各種問(wèn)題,導(dǎo)致不敢使用多線程。但是多線程技術(shù)在做開發(fā)中,是不可忽視的一個(gè)技術(shù),基本上我們實(shí)際應(yīng)用中,每個(gè)項(xiàng)目都會(huì)使用多線程,所以多線程技術(shù)必須掌握。

為什么要用多線程

隨著工業(yè)的進(jìn)步,現(xiàn)在的筆記本、臺(tái)式機(jī)大都是雙核的,4核、8核甚至16核,也很常見(jiàn),如果是單線程的程序,那么在雙核CPU上就浪費(fèi)了50%,在4核CPU上就浪費(fèi)了75%。

單核CPU上所謂的”多線程”那是假的多線程,同一時(shí)間處理器只會(huì)處理一段邏輯,只不過(guò)線程之間切換得比較快,看著像多個(gè)線程”同時(shí)”運(yùn)行罷了。

多核CPU上的多線程才是真正的多線程,它能讓你的多段邏輯同時(shí)工作,多線程,可以真正發(fā)揮出多核CPU的優(yōu)勢(shì)來(lái),達(dá)到充分利用CPU的目的。

如果你做項(xiàng)目不使用多線程,不僅是技術(shù)的問(wèn)題,也是對(duì)電腦資源的極大浪費(fèi),就像你買了一輛配置非常高的越野車,你僅僅只用它來(lái)日常代步一樣。3

為什么不敢用多線程

之前跟一些學(xué)員溝通時(shí)發(fā)現(xiàn),很多學(xué)員之所以不敢使用多線程,是因?yàn)橹俺鲞^(guò)問(wèn)題,有種“一朝被蛇咬,十年怕井繩”的感覺(jué)。

為什么多線程容易出問(wèn)題,有個(gè)主要的原因在于多線程充滿著“未知性”,有的人使用時(shí),發(fā)現(xiàn)代碼并沒(méi)有按照預(yù)想的流程在走,這其實(shí)是正常的。

我們必須要明確一點(diǎn),多線程確實(shí)是“不可控的”,有某種意義上來(lái)說(shuō),多線程是靠CPU調(diào)度來(lái)執(zhí)行的,并非人為去控制。

我們所謂的控制多線程,僅僅是.NET框架開放了一些接口開發(fā)者,這樣可以相對(duì)性地間接控制多線程的啟動(dòng)停止暫停繼續(xù)。

線程的啟動(dòng)停止

線程的啟動(dòng)停止,從.Net Framework 4.5開始,Task提供了一個(gè)叫CancellationTokenSource的對(duì)象,可以使用它來(lái)對(duì)多線程的啟停進(jìn)行控制。

首先,我們做一個(gè)線程任務(wù),這個(gè)任務(wù)很簡(jiǎn)單,只是不斷操作某個(gè)變量,每0.1秒加1,到一定值之后,重置為0,然后將這個(gè)值顯示在界面上,界面如下所示:

pYYBAGJCommAHohAAAEBK_S4MA8205.png

所以任務(wù)方法如下:

poYBAGJCommAUQsFAAFCzNteiYk911.png

個(gè)對(duì)象就是CancellationTokenSource的對(duì)象,因此我們需要?jiǎng)?chuàng)建一個(gè)CancellationTokenSource對(duì)象cts:

pYYBAGJCommAeFBDAAByrWJa05o840.png

然后在啟動(dòng)線程按鈕的事件里,編寫代碼如下:

poYBAGJCommALjvEAAC33LkZg20419.png

停止線程按鈕的事件里,只需要調(diào)用cts的Cancel方法即可:

pYYBAGJCommAfnHqAACJjBQEKQs412.png

其實(shí),說(shuō)白了,就是通過(guò)cts來(lái)控制cts的IsCancellationRequested屬性,進(jìn)而實(shí)現(xiàn)多線程的控制。

線程的暫停繼續(xù)

多線程的暫停繼續(xù),.NET為我們提供了另外一個(gè)對(duì)象——ManualResetEvent,這個(gè)對(duì)象會(huì)有一個(gè)值,這個(gè)值是布爾類型,就像一個(gè)門閘一樣,True是打開門閘,F(xiàn)alse是關(guān)閉門閘,所以想要暫停多線程就調(diào)用這個(gè)對(duì)象的Reset方法,想要繼續(xù)多線程就調(diào)用這個(gè)對(duì)象的Set方法,使用非常簡(jiǎn)單。

首先我們創(chuàng)建一下這個(gè)對(duì)象,可以通過(guò)構(gòu)造方法,給這個(gè)對(duì)象賦初始值,我這里為True,這樣就能直接運(yùn)行,不會(huì)阻塞。

poYBAGJCommAFYwjAACT6iBUZqo649.png

但是如果希望這個(gè)對(duì)象與多線程有所聯(lián)系,必須要在多線程的方法里體現(xiàn)這個(gè)對(duì)象的作用,這個(gè)是調(diào)用這個(gè)對(duì)象的WaitOne方法,表示在調(diào)用的地方阻塞住,通過(guò)判斷True或者False來(lái)決定是否繼續(xù)執(zhí)行,就像大家開車過(guò)高速收費(fèi)站一樣,即使現(xiàn)在普遍采用ETC了,在入口也需要減速,有一個(gè)ETC識(shí)別的過(guò)程,識(shí)別成功才會(huì)抬桿,識(shí)別識(shí)別,桿子是不會(huì)自動(dòng)抬起的,這個(gè)是一樣的道理。

所以線程執(zhí)行代碼如下:

pYYBAGJComqAQ0XgAACDmtYVuHw124.png

對(duì)比一下,其實(shí)就是加了一個(gè)manual.WaitOne()。

線程暫停代碼:

poYBAGJComqAWj-YAAAuPKiIW90610.png

線程繼續(xù)代碼:

pYYBAGJComqACdzRAAB-g448phs190.png

AutoResetEvent

AutoResetEvent和ManualResetEvent的用法非常相似,區(qū)別在于一個(gè)是手動(dòng),一個(gè)是自動(dòng),AutoResetEvent會(huì)在置位之后自動(dòng)復(fù)位,這樣體現(xiàn)在多線程里,就是會(huì)只執(zhí)行一次,就像大家進(jìn)小區(qū)一樣,如果有10輛車在排隊(duì),這時(shí)候如果自動(dòng)模式,每次只能進(jìn)一輛車,如果是手動(dòng)模式,可以由保安控制門閘打開,等10輛車都進(jìn)去之后,再由保安將門閘關(guān)注。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20454
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70802
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    多線程的安全注意事項(xiàng)

    多線程安全是指多個(gè)線程同時(shí)訪問(wèn)或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進(jìn)行多線程開發(fā)時(shí),在TaskPool和Worker的工作線程中導(dǎo)
    發(fā)表于 06-20 07:49

    鴻蒙5開發(fā)寶藏案例分享---跨線程性能優(yōu)化指南

    ;>Worker</span>做多線程開發(fā)時(shí),總遇到對(duì)象跨線程卡頓的問(wèn)題,原來(lái)鴻蒙早就提供了解決方案。下面結(jié)合代碼和實(shí)戰(zhàn)案例,帶你徹底玩轉(zhuǎn)性能優(yōu)化! 一、痛點(diǎn):跨線程
    發(fā)表于 06-12 17:13

    工控一體機(jī)多線程任務(wù)調(diào)度優(yōu)化:聚徽分享破解工業(yè)復(fù)雜流程高效協(xié)同密碼

    在當(dāng)今工業(yè) 4.0 的浪潮下,工業(yè)生產(chǎn)正朝著高度自動(dòng)化、智能化的方向大步邁進(jìn)。生產(chǎn)流程日益復(fù)雜,眾多任務(wù)需要同時(shí)、高效地協(xié)同執(zhí)行,這對(duì)工業(yè)控制系統(tǒng)的核心 —— 工控一體機(jī)提出了前所未有的挑戰(zhàn)。多線程
    的頭像 發(fā)表于 05-28 14:06 ?181次閱讀

    2.4 GHz 前端模塊 (FEM),用于 Zigbee 技術(shù)線程和設(shè)備,具有適合藍(lán)牙?應(yīng)用的端口 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()2.4 GHz 前端模塊 (FEM),用于 Zigbee 技術(shù)、線程和設(shè)備,具有適合藍(lán)牙?應(yīng)用的端口相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有2.4 GHz 前端模塊 (FEM),用于
    發(fā)表于 05-15 18:30
    2.4 GHz 前端模塊 (FEM),用于 Zigbee <b class='flag-5'>技術(shù)</b>、<b class='flag-5'>線程</b>和設(shè)備,具有適合藍(lán)牙?應(yīng)用的端口 skyworksinc

    一種實(shí)時(shí)多線程VSLAM框架vS-Graphs介紹

    針對(duì)現(xiàn)有VSLAM系統(tǒng)語(yǔ)義表達(dá)不足、地圖可解釋性差的問(wèn)題,本文提出vS-Graphs,一種實(shí)時(shí)多線程VSLAM框架。該方案顯著提升了重建地圖的語(yǔ)義豐富度、可解釋性及定位精度。實(shí)驗(yàn)表明
    的頭像 發(fā)表于 04-19 14:07 ?403次閱讀
    一種實(shí)時(shí)<b class='flag-5'>多線程</b>VSLAM框架vS-Graphs介紹

    進(jìn)程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    各位程序員朋友(和假裝懂技術(shù)的同事):如果你在面試時(shí)被問(wèn)到:\"請(qǐng)用奶茶店類比進(jìn)程、線程和協(xié)程\",而你回答:\"進(jìn)程是老板,線程是員工,協(xié)程是兼職...\"
    發(fā)表于 03-26 09:27

    請(qǐng)問(wèn)如何在Python中實(shí)現(xiàn)多線程與多進(jìn)程的協(xié)作?

    大家好!我最近在開發(fā)一個(gè)Python項(xiàng)目時(shí),需要同時(shí)處理多個(gè)任務(wù),且每個(gè)任務(wù)需要不同的計(jì)算資源。我想通過(guò)多線程和多進(jìn)程的組合來(lái)實(shí)現(xiàn)并發(fā),但遇到了一些問(wèn)題。 具體來(lái)說(shuō),我有兩個(gè)任務(wù),一個(gè)是I/O密集型
    發(fā)表于 03-11 06:57

    請(qǐng)問(wèn)rt-thread studio如何進(jìn)行多線程編譯?

    ,使用的是5800h+32g內(nèi)存+sn550 ssd,開啟16線程編譯時(shí)cpu的占用率也只能到30%,編譯完整個(gè)工程需要3分鐘 感覺(jué)多線程編譯設(shè)置沒(méi)有生效,有辦法提高編譯速度嗎
    發(fā)表于 02-19 08:30

    華為云 X 實(shí)例 CPU 性能測(cè)試詳解與優(yōu)化策略

    ? 2.2 Sysbench單線程CPU性能測(cè)試 ? 2.3 Sysbench多線程CPU性能測(cè)試(4線程) ? 2.4 高強(qiáng)度多線程CPU性能測(cè)試(8
    的頭像 發(fā)表于 12-30 14:52 ?685次閱讀
    華為云 X 實(shí)例 CPU 性能測(cè)試詳解與優(yōu)化策略

    探索字節(jié)隊(duì)列的魔法:多類型支持、函數(shù)重載與線程安全

    的數(shù)據(jù)結(jié)構(gòu),它能夠高效地存儲(chǔ)和管理數(shù)據(jù)流。通過(guò)使用字節(jié)隊(duì)列,我們可以靈活地處理不同類型的數(shù)據(jù)、確保數(shù)據(jù)的完整性,并在多線程環(huán)境中安全地進(jìn)行操作。本文將深入探討字節(jié)
    的頭像 發(fā)表于 11-15 01:08 ?1247次閱讀
    探索字節(jié)隊(duì)列的魔法:多類型支持、函數(shù)重載與<b class='flag-5'>線程</b>安全

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。
    的頭像 發(fā)表于 11-12 14:16 ?1028次閱讀

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程池與進(jìn)程池來(lái)提高并發(fā)執(zhí)行效率。
    的頭像 發(fā)表于 10-23 11:48 ?1029次閱讀
    Python中<b class='flag-5'>多線程</b>和多進(jìn)程的區(qū)別

    CPU線程和程序線程的區(qū)別

    CPU的線程與程序的線程在概念、作用、實(shí)現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對(duì)兩者區(qū)別的詳細(xì)闡述,旨在深入探討這一技術(shù)話題。
    的頭像 發(fā)表于 09-02 11:18 ?2138次閱讀

    一文掌握Python多線程

    使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1285次閱讀

    LWIP多線程強(qiáng)烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面要怎么實(shí)現(xiàn)?

    LWIP多線程強(qiáng)烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面要怎么實(shí)現(xiàn),之前參考網(wǎng)上代碼,這樣寫,壓力測(cè)試下有概率斷言失敗 extern sys_mutex_t
    發(fā)表于 07-25 06:27