十六線程間同步技術(shù)與應(yīng)用_第1頁
十六線程間同步技術(shù)與應(yīng)用_第2頁
十六線程間同步技術(shù)與應(yīng)用_第3頁
十六線程間同步技術(shù)與應(yīng)用_第4頁
十六線程間同步技術(shù)與應(yīng)用_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1

2

3線程間同步技術(shù)與應(yīng)用匯報人XXX時間20XX.X202XCatalogue目錄1.多線程同步概述PartOne信號量PartTwo2.互斥量PartThree事件集PartFour3.4.總結(jié)PartFive課后作業(yè)PartSix5.6.

1

2

202X3多線程同步概述Part01線程同步是指多個線程通過特定機(jī)制控制執(zhí)行順序,確保對共享資源的訪問互斥性。如多個線程訪問共享內(nèi)存時,需按順序操作,防止數(shù)據(jù)錯亂。例如,在多線程系統(tǒng)中,一個線程負(fù)責(zé)采集數(shù)據(jù)寫入共享內(nèi)存,另一個線程負(fù)責(zé)讀取數(shù)據(jù)進(jìn)行處理,若不進(jìn)行同步,讀取線程可能讀到未寫完的數(shù)據(jù),導(dǎo)致錯誤結(jié)果。線程同步的定義線程互斥是線程同步的一種特殊形式,用于保證同一時刻只有一個線程訪問臨界區(qū)資源?;コ馐峭降幕A(chǔ),同步是互斥的擴(kuò)展。比如在銀行取款系統(tǒng)中,多個窗口(線程)操作同一個賬戶(臨界區(qū)資源)時,必須互斥訪問賬戶余額,以保證數(shù)據(jù)一致性;而同步則可以控制窗口服務(wù)的順序,提高系統(tǒng)效率。同步與互斥的關(guān)系臨界區(qū)是指多個線程操作的同一塊代碼區(qū)域,這塊代碼涉及對共享資源的訪問。在臨界區(qū)內(nèi),線程的操作必須是互斥的。以交通路口為例,多個方向的車輛(線程)都要經(jīng)過路口(臨界區(qū)),若沒有交通信號燈(同步機(jī)制)控制,車輛會相互碰撞,造成交通混亂。臨界區(qū)的概念線程同步的概念與重要性03.01.02.數(shù)據(jù)一致性問題當(dāng)多個線程同時訪問和修改共享數(shù)據(jù)時,若沒有同步機(jī)制,會導(dǎo)致數(shù)據(jù)不一致。例如,一個線程正在寫入數(shù)據(jù),另一個線程同時讀取,讀取到的數(shù)據(jù)可能是錯誤的。在文件系統(tǒng)中,多個進(jìn)程同時對一個文件進(jìn)行讀寫操作,若不進(jìn)行同步,文件內(nèi)容可能會出現(xiàn)亂碼或丟失數(shù)據(jù)。競態(tài)條件競態(tài)條件是指多個線程的執(zhí)行順序?qū)Τ绦蚪Y(jié)果產(chǎn)生影響的情況。當(dāng)線程間存在依賴關(guān)系時,若執(zhí)行順序被打亂,可能導(dǎo)致程序出現(xiàn)錯誤。例如,在一個計數(shù)器程序中,多個線程同時對計數(shù)器進(jìn)行加1操作,若沒有同步機(jī)制,線程的執(zhí)行順序不同,最終的計數(shù)值可能會小于實際線程數(shù)。死鎖與饑餓死鎖是指兩個或多個線程因相互等待對方持有的資源而無法繼續(xù)執(zhí)行的現(xiàn)象。饑餓是指一個線程因長時間無法獲得資源而無法執(zhí)行。例如,線程A持有資源X并請求資源Y,線程B持有資源Y并請求資源X,此時兩個線程都會陷入死鎖狀態(tài);而一個低優(yōu)先級的線程可能因高優(yōu)先級線程頻繁占用資源而長時間無法執(zhí)行,導(dǎo)致饑餓。線程同步的常見問題

1

2

202X3信號量Part02信號量是一種輕量級的內(nèi)核對象,用于解決線程間同步問題。它通過一個非負(fù)整數(shù)值和一個線程等待隊列來控制線程對共享資源的訪問。例如,停車場的管理員手中的空車位數(shù)可以看作信號量的值,車輛(線程)通過獲取管理員的允許(信號量)進(jìn)入停車場(訪問共享資源)。信號量的定義在RT-Thread中,信號量通過rt_sem_create函數(shù)創(chuàng)建,需要指定信號量名稱、初始值和標(biāo)志。信號量初始值表示初始可用資源的數(shù)量,標(biāo)志用于設(shè)置線程等待隊列的調(diào)度方式。例如,rt_sem_create("sem",1,RT_IPC_FLAG_FIFO)創(chuàng)建一個名為"sem"的信號量,初始值為1,采用先進(jìn)先出的調(diào)度方式。信號量的創(chuàng)建與初始化信號量的值表示可用資源的數(shù)量,當(dāng)線程獲取信號量時,信號量值減1;當(dāng)線程釋放信號量時,信號量值加1。若信號量值為0,線程將被掛起等待。例如,在一個生產(chǎn)者-消費(fèi)者模型中,生產(chǎn)者線程生產(chǎn)產(chǎn)品后釋放信號量,消費(fèi)者線程獲取信號量后消費(fèi)產(chǎn)品,通過信號量控制生產(chǎn)者和消費(fèi)者的同步。信號量的工作原理信號量的概念與工作機(jī)制獲取信號量使用rt_sem_take函數(shù),線程通過該函數(shù)嘗試獲取信號量。若信號量值大于0,線程獲取信號量成功,信號量值減1;若信號量值為0,線程將根據(jù)等待時間參數(shù)掛起等待。例如,rt_sem_take(sem,RT_WAITING_FOREVER)表示線程永久等待信號量,直到獲取成功。獲取信號量釋放信號量使用rt_sem_release函數(shù),線程通過該函數(shù)釋放信號量,信號量值加1。若等待隊列中有線程等待該信號量,將喚醒等待隊列中的第一個線程。例如,rt_sem_release(sem)釋放信號量,喚醒等待該信號量的線程。釋放信號量刪除信號量使用rt_sem_delete函數(shù),該函數(shù)將刪除信號量并釋放其占用的資源。若信號量上有線程等待,將喚醒等待線程并返回錯誤。例如,rt_sem_delete(sem)刪除信號量,釋放資源。信號量的刪除與脫離信號量的操作函數(shù)任務(wù)描述基于龍芯1B開發(fā)板和RT-Thread實時操作系統(tǒng),創(chuàng)建兩個線程,一個線程獲取信號量后切換LCD屏背景色,另一個線程獲取信號量后顯示LED流水燈5遍。兩個線程獨(dú)立運(yùn)行,獲取信號量的線程一直等待信號量,等待時間為永久等待。任務(wù)分析本任務(wù)的核心是通過信號量實現(xiàn)兩個線程的同步。線程1負(fù)責(zé)切換LCD屏背景色,線程2負(fù)責(zé)顯示LED流水燈。兩個線程通過信號量進(jìn)行協(xié)調(diào),確保一個線程完成任務(wù)后釋放信號量,另一個線程獲取信號量后繼續(xù)執(zhí)行。信號量的初始值設(shè)置為1,表示初始時有一個可用的信號量。線程1和線程2通過rt_sem_take函數(shù)獲取信號量,通過rt_sem_release函數(shù)釋放信號量。任務(wù)實施新建項目:依次點(diǎn)擊“文件”→“新建”→“新建項目向?qū)А保鶕?jù)項目向?qū)瓿尚陆椖?。配置宏定義:在bsp.h文件中打開BSP_USE_I2CO、BSP_USE_FB、GT1151_DRV等宏定義。定義信號量和線程控制塊:在main.c文件中定義信號量控制塊和兩個線程控制塊。線程1負(fù)責(zé)切換LCD屏背景色,線程2負(fù)責(zé)顯示LED流水燈。編寫線程函數(shù):線程1通過rt_device_control函數(shù)切換LCD屏背景色,線程2通過waterfallLight函數(shù)顯示LED流水燈。兩個線程在執(zhí)行任務(wù)前后通過rt_sem_take和rt_sem_release函數(shù)獲取和釋放信號量。創(chuàng)建信號量和線程:在main函數(shù)中創(chuàng)建信號量和兩個線程,并啟動線程。編譯與調(diào)試:點(diǎn)擊編譯,編譯無誤后點(diǎn)擊運(yùn)行,將程序加載到內(nèi)存中。測試程序,觀察LCD屏背景色切換和LED流水燈顯示是否正常。任務(wù)拓展增加線程優(yōu)先級控制:為線程設(shè)置不同的優(yōu)先級,觀察高優(yōu)先級線程是否能更快地獲取信號量。增加信號量數(shù)量:將信號量的初始值設(shè)置為多個,觀察多個線程同時獲取信號量的情況。結(jié)合其他同步機(jī)制:結(jié)合互斥量或事件集,實現(xiàn)更復(fù)雜的同步控制。01020304任務(wù)16:信號量應(yīng)用

1

2

202X3互斥量Part03互斥量是一種特殊的二值信號量,用于實現(xiàn)對臨界資源的獨(dú)占式訪問?;コ饬恐挥袃煞N狀態(tài):鎖定(LOCKED)和解鎖(UNLOCKED)。例如,一個文件被一個線程打開并鎖定,其他線程無法同時打開該文件,直到第一個線程釋放互斥量?;コ饬康亩x互斥量的初始狀態(tài)為解鎖狀態(tài),當(dāng)一個線程獲取互斥量后,互斥量變?yōu)殒i定狀態(tài),其他線程將被掛起等待。只有持有互斥量的線程可以釋放它。例如,在一個數(shù)據(jù)庫系統(tǒng)中,多個線程需要訪問同一個表,通過互斥量確保同一時刻只有一個線程可以操作該表,防止數(shù)據(jù)沖突?;コ饬康墓ぷ髟碓赗T-Thread中,互斥量通過rt_mutex_create函數(shù)創(chuàng)建,需要指定互斥量名稱和標(biāo)志。標(biāo)志用于設(shè)置線程等待隊列的調(diào)度方式。例如,rt_mutex_create("mutex",RT_IPC_FLAG_FIFO)創(chuàng)建一個名為"mutex"的互斥量,采用先進(jìn)先出的調(diào)度方式?;コ饬康膭?chuàng)建與初始化互斥量的概念與工作機(jī)制獲取互斥量使用rt_mutex_take函數(shù),線程通過該函數(shù)嘗試獲取互斥量。若互斥量未被鎖定,線程獲取互斥量成功,互斥量變?yōu)殒i定狀態(tài);若互斥量已被鎖定,線程將根據(jù)等待時間參數(shù)掛起等待。例如,rt_mutex_take(mutex,RT_WAITING_FOREVER)表示線程永久等待互斥量,直到獲取成功。獲取互斥量互斥量的刪除與脫離刪除互斥量使用rt_mutex_delete函數(shù),該函數(shù)將刪除互斥量并釋放其占用的資源。若互斥量上有線程等待,將喚醒等待線程并返回錯誤。例如,rt_mutex_delete(mutex)刪除互斥量,釋放資源。釋放互斥量釋放互斥量使用rt_mutex_release函數(shù),線程通過該函數(shù)釋放互斥量,互斥量變?yōu)榻怄i狀態(tài)。若等待隊列中有線程等待該互斥量,將喚醒等待隊列中的第一個線程。例如,rt_mutex_release(mutex)釋放互斥量,喚醒等待該互斥量的線程。互斥量的操作函數(shù)任務(wù)描述基于龍芯1B開發(fā)板和RT-Thread實時操作系統(tǒng),創(chuàng)建兩個線程,兩個線程都往SPI

Flash中相同起始地址寫入不同的內(nèi)容,再讀取出來。使用互斥量保證正在讀取的線程不被打斷。任務(wù)實施新建項目:依次點(diǎn)擊“文件”→“新建”→“新建項目向?qū)А保鶕?jù)項目向?qū)瓿尚陆椖?。配置宏定義:在bsp.h文件中打開BSP_USE_SPI、W25X40_DRV等宏定義。定義互斥量和線程控制塊:在main.c文件中定義互斥量和兩個線程控制塊。線程1和線程2分別往SPIFlash中寫入不同的內(nèi)容,再讀取出來。編寫線程函數(shù):線程1和線程2在寫入和讀取數(shù)據(jù)前后通過rt_mutex_take和rt_mutex_release函數(shù)獲取和釋放互斥量,確保數(shù)據(jù)操作的互斥性。創(chuàng)建互斥量和線程:在main函數(shù)中創(chuàng)建互斥量和兩個線程,并啟動線程。編譯與調(diào)試:點(diǎn)擊編譯,編譯無誤后點(diǎn)擊運(yùn)行,將程序加載到內(nèi)存中。測試程序,觀察SPIFlash中的數(shù)據(jù)是否正確寫入和讀取。任務(wù)分析本任務(wù)的核心是通過互斥量保護(hù)共享資源SPI

Flash,防止多個線程同時寫入或讀取數(shù)據(jù)導(dǎo)致數(shù)據(jù)錯亂?;コ饬看_保同一時刻只有一個線程可以訪問SPIFlash?;コ饬康某跏紶顟B(tài)為解鎖狀態(tài),線程通過rt_mutex_take函數(shù)獲取互斥量,通過rt_mutex_release函數(shù)釋放互斥量。任務(wù)拓展增加線程數(shù)量:增加更多線程同時訪問SPI

Flash,觀察互斥量的保護(hù)效果。結(jié)合信號量:結(jié)合信號量實現(xiàn)線程間的同步控制,例如控制線程的執(zhí)行順序。優(yōu)化性能:通過減少互斥量的持有時間,提高系統(tǒng)的并發(fā)性能。任務(wù)17:互斥量應(yīng)用

1

2

202X3事件集Part040103事件集的定義事件集是一種用于線程間同步的機(jī)制,可以實現(xiàn)一對多、多對多的同步。事件集通過一個32位無符號整型變量表示多個事件,每一位代表一個事件。例如,一個線程可以等待多個事件中的任意一個發(fā)生,也可以等待多個事件都發(fā)生后才繼續(xù)執(zhí)行。事件集的工作原理事件集支持“邏輯與”和“邏輯或”兩種同步方式。線程可以通過“邏輯與”方式等待多個事件都發(fā)生,也可以通過“邏輯或”方式等待任意一個事件發(fā)生。例如,在一個多媒體播放系統(tǒng)中,一個線程可以等待音頻數(shù)據(jù)和視頻數(shù)據(jù)都準(zhǔn)備好后才開始播放,也可以等待音頻數(shù)據(jù)或視頻數(shù)據(jù)中的任意一個準(zhǔn)備好后就開始處理。事件集的創(chuàng)建與初始化在RT-Thread中,事件集通過rt_event_create函數(shù)創(chuàng)建,需要指定事件集名稱和標(biāo)志。標(biāo)志用于設(shè)置線程等待隊列的調(diào)度方式。例如,rt_event_create("event",RT_IPC_FLAG_FIFO)創(chuàng)建一個名為"event"的事件集,采用先進(jìn)先出的調(diào)度方式。事件集的概念與工作機(jī)制0201發(fā)送事件使用rt_event_send函數(shù),線程通過該函數(shù)向事件集發(fā)送一個或多個事件。事件集的相應(yīng)位將被設(shè)置為1。例如,rt_event_send(event,EVENT_FLAG1|EVENT_FLAG2)向事件集發(fā)送事件1和事件2。發(fā)送事件02接收事件使用rt_event_recv函數(shù),線程通過該函數(shù)從事件集中接收感興趣的事件。線程可以根據(jù)“邏輯與”或“邏輯或”方式選擇接收事件的方式。例如,rt_event_recv(event,EVENT_FLAG1|EVENT_FLAG2,RT_EVENT_FLAG_AND,RT_WAITING_FOREVER,&recved)表示線程等待事件1和事件2都發(fā)生后才繼續(xù)執(zhí)行。接收事件03刪除事件集使用rt_event_delete函數(shù),該函數(shù)將刪除事件集并釋放其占用的資源。若事件集上有線程等待,將喚醒等待線程并返回錯誤。例如,rt_event_delete(event)刪除事件集,釋放資源。事件集的刪除與脫離事件集的操作函數(shù)基于龍芯1B開發(fā)板和RT-Thread實時操作系統(tǒng),創(chuàng)建一個事件集和三個線程。兩個線程等待自己關(guān)心的事件發(fā)生,一個線程發(fā)送事件。RTC線程將RTC初始時間設(shè)置為2022年2月27日9:59:00,當(dāng)秒鐘大于5秒且小于10秒時,發(fā)送事件1;按下KEY_UP鍵后,發(fā)送事件2,蜂鳴器響起,LCD顯示一張圖片;按下KEY_2鍵時,發(fā)送事件1,蜂鳴器關(guān)閉,LCD清屏。任務(wù)描述新建項目:依次點(diǎn)擊“文件”→“新建”→“新建項目向?qū)А保鶕?jù)項目向?qū)瓿尚陆椖?。配置宏定義:在bsp.h文件中打開BSP_USE_I2CO、BSP_USE_FB、GT1151_DRV、PCA9557_DRV等宏定義。定義事件集和線程控制塊:在main.c文件中定義事件集和三個線程控制塊。線程1和線程2分別等待不同的事件,線程3負(fù)責(zé)發(fā)送事件。編寫線程函數(shù):線程1和線程2通過rt_event_recv函數(shù)等待事件的發(fā)生,并根據(jù)接收到的事件執(zhí)行相應(yīng)的操作,如蜂鳴器控制和LCD顯示;線程3通過rt_event_send函數(shù)發(fā)送事件。創(chuàng)建事件集和線程:在main函數(shù)中創(chuàng)建事件集和三個線程,并啟動線程。編譯與調(diào)試:點(diǎn)擊編譯,編譯無誤后點(diǎn)擊運(yùn)行,將程序加載到內(nèi)存中。測試程序,觀察蜂鳴器和LCD的顯示是否符合預(yù)期。任務(wù)實施本任務(wù)的核心是通過事件集實現(xiàn)多個線程的同步控制。事件集允許一個線程發(fā)送事件,多個線程根據(jù)事件的發(fā)生進(jìn)行相應(yīng)的操作。事件集的“邏輯與”和“邏輯或”方式可以靈活控制線程的等待條件,例如,一個線程可以等待多個事件都發(fā)生后才繼續(xù)執(zhí)行,另一個線程可以等待任意一個事件發(fā)生后就繼續(xù)執(zhí)行。任務(wù)分析增加更多事件:定義更多事件,實現(xiàn)更復(fù)雜的線程同步控制。結(jié)合信號量和互斥量:結(jié)合信號量和互斥量,實現(xiàn)線程間的同步和互斥控制。優(yōu)化事件處理邏輯:通過優(yōu)化事件處理邏輯,減少線程的等待時間,提高系統(tǒng)響應(yīng)速度。任務(wù)拓展任務(wù)18:事件集應(yīng)用

1

2

202X3總結(jié)Part0501本模塊了解了線程間同步是多線程系統(tǒng)中的重要機(jī)制,通過信號量、互斥量和事件集等同步機(jī)制,可以有效解決線程間的同步問題,確保程序的正確性和穩(wěn)定性。信號量適用于控制線程對共享資源的訪問,互斥量用于保護(hù)臨界資源,事件集則可以實現(xiàn)復(fù)雜的線程同步控制。在實際應(yīng)用中,可以根據(jù)具體需求選擇合適的同步機(jī)制,或結(jié)合多種同步機(jī)制實現(xiàn)更高效的線程協(xié)調(diào)。02在實踐項目中,通過模擬實際場景,如智能教室節(jié)能系統(tǒng)、智能交通信號燈模擬系統(tǒng)等,培養(yǎng)學(xué)生的節(jié)能意識、環(huán)保責(zé)任感和遵守規(guī)則的意識。讓學(xué)生在技術(shù)學(xué)習(xí)過程中,樹立正確的價值觀和社會責(zé)任感,增強(qiáng)學(xué)生的民族自豪感和使命感,鼓勵學(xué)生為國產(chǎn)技術(shù)發(fā)展貢獻(xiàn)力量。03以多個具體任務(wù)為導(dǎo)向,如信號量應(yīng)用、互斥量應(yīng)用和事件集應(yīng)用,讓學(xué)生在實際操作中掌握多線程同步編程。從新建項目、配置開發(fā)環(huán)境到編寫代碼、調(diào)試程序,學(xué)生在實踐中提升解決問題的能力,積累項目經(jīng)驗。通過這些項目,學(xué)生能夠更好地將理論知識與實際應(yīng)用相結(jié)合,為今后從事相關(guān)領(lǐng)域工作打下堅實基礎(chǔ)。

1

2

202X3課后作業(yè)Part06`課后習(xí)題一.選擇題1.在多線程實時系統(tǒng)中,線程同步的主要目的是()A.提高線程的執(zhí)行速度B.確保線程按預(yù)定順序執(zhí)行,防止數(shù)據(jù)錯亂C.減少線程的資源占用D.增加線程的數(shù)量答案:B2.信號量的值表示()A.線程的數(shù)量B.可用資源的數(shù)量C.線程的優(yōu)先級D.線程的執(zhí)行時間答案:B3.互斥量與信號量的主要區(qū)別在于()A.互斥量只能由持有它的線程釋放,信號量可以由任意線程釋放B.互斥量可以用于多個線程,信號量只能用于兩個線程C.互斥量的值只能是0或1,信號量的值可以是任意整數(shù)D.互斥量用于線程同步,信號量用于線程互斥答案:A4.事件集的特點(diǎn)是()A.只能實現(xiàn)一對一的同步B.只能實現(xiàn)一對多的同步C.可以實現(xiàn)一對多、多對多的同步D.只能實現(xiàn)多對一的同步答案:C5.在RT-Thread中,創(chuàng)建信號量使用的函數(shù)是()A.rt_sem_createB.rt_mutex_createC.rt_event_createD.r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論