在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

詳細(xì)講解一下不同的LabVIEW多線程同步機(jī)制

jf_V8z5L4Nx ? 來源:傳感測(cè)控物聯(lián)網(wǎng) ? 2023-08-03 10:16 ? 次閱讀

我們提到過使用局部變量、全局變量時(shí),必須注意處理好并發(fā)訪問。

舉個(gè)例子:有A、B、C三個(gè)線程在并發(fā)執(zhí)行。A線程修改了變量V的值,期望線程C能夠讀取到最新的值。B線程卻在C線程讀取變量V的值之前修改了V的值。這種情況我們說變量V被污染了、數(shù)據(jù)臟了。 要處理好變量的并發(fā)訪問、多線程對(duì)變量的訪問,我們需要使用同步機(jī)制。

在多線程軟件設(shè)計(jì)中,不僅僅對(duì)變量的訪問,對(duì)任何競(jìng)爭(zhēng)性資源的使用/訪問都必須使用合理的同步機(jī)制進(jìn)行管理。比如,有兩個(gè)線程都需要使用某個(gè)模擬輸出通道,但是模擬輸出通道只有1個(gè)、同一時(shí)刻只能由1個(gè)線程使用,這種情況下我們把這個(gè)模擬輸出通道稱作競(jìng)爭(zhēng)性資源。

如果不對(duì)這個(gè)模擬輸出通道的訪問進(jìn)行合理的管理,可能導(dǎo)致輸出錯(cuò)誤的模擬量、線程死鎖、軟件假死等問題。

LabVIEW可用的同步機(jī)制

在Programming->Synchronization分類下,我們可以看到LabVIEW里可用的同步機(jī)制。

0594e44c-3137-11ee-9e74-dac502259ad0.png

名稱 作用 相關(guān)VI
通知器操作
Notifier Operations
掛起某個(gè)線程直到收到某個(gè)通知 Wait on Notification、Send Notification等
隊(duì)列操作
QueueOperations
使用隊(duì)列在線程內(nèi)或線程間傳遞數(shù)據(jù) Enqueue Element、DequeueElement等
信號(hào)
Semphore
通過信號(hào)量限制對(duì)競(jìng)爭(zhēng)性資源的訪問 Acquire Semphore、Release Semphore等
集合點(diǎn)
Rendezvous
通過集合點(diǎn)同步多個(gè)線程。每個(gè)到達(dá)集合點(diǎn)的任務(wù)將等待,直到集合點(diǎn)處等待的任務(wù)達(dá)到指定的數(shù)量后,所有任務(wù)才繼續(xù)執(zhí)行。 Wait at Rendezvous、Resize Rendezvous等
事件發(fā)生
Occurrence
通過事件發(fā)生控制和同步線程內(nèi)或線程間的活動(dòng)。 Generate Occurrence、Wait on Occurrence等
首次調(diào)用
First Call?
判斷某段代碼或某個(gè)子VI是否首次執(zhí)行 /
同步數(shù)據(jù)流
Synchronize Data Flow
同步數(shù)據(jù)流,可使用多個(gè)線程的數(shù)據(jù)傳送在該VI處得到同步,以確保數(shù)據(jù)傳送順序。 /

同步機(jī)制的應(yīng)用

下面我們用具體的例子來詳細(xì)講解一下不同的同步機(jī)制。

1)Notifer Operations

05a8755c-3137-11ee-9e74-dac502259ad0.png

上面這個(gè)示例,Loop1和Loop2是兩個(gè)并行的線程。這是實(shí)現(xiàn)多線程的最基本的方法。Loop1負(fù)責(zé)產(chǎn)生數(shù)據(jù)和停止這兩個(gè)線程的運(yùn)行;Loop2負(fù)責(zé)讀取Loop1產(chǎn)生的數(shù)據(jù),并在需要的時(shí)候及時(shí)終止線程(退出循環(huán))。它是怎么實(shí)現(xiàn)的呢?Loop2等待數(shù)據(jù)通知器發(fā)出通知、等待終止通知器發(fā)出通知,收到通知后把數(shù)據(jù)讀出來或者退出循環(huán)。Loop1則是把數(shù)據(jù)或者退出控件值通過發(fā)送通知傳遞給Loop2。

第一步:Obtain Notifer,獲取通知器,如果不存在則創(chuàng)建。創(chuàng)建時(shí)按照初始值進(jìn)行初始化。

第二步:Send Notification,發(fā)送通知。把數(shù)據(jù)或者控件值通過發(fā)送通知發(fā)送給等待對(duì)應(yīng)通知器的線程。

第三步:Wait on Notification,等待通知。Loop2里調(diào)用Wait on Notification掛起線程,直到收到Loop1發(fā)出的通知后繼續(xù)執(zhí)行。

第四步:Release Notifer,釋放通知器。釋放資源,避免內(nèi)存泄露。 這個(gè)示例里L(fēng)oop1加了100ms的等待,可以確保通過Send Notification發(fā)送出去的數(shù)據(jù)可以被Loop2獲取到。

如果沒有這個(gè)等待100ms,Loop1發(fā)送的數(shù)據(jù)是可能丟失的,通知器不會(huì)緩沖已經(jīng)發(fā)送的消息,新的消息會(huì)覆蓋舊的消息。如果需要緩沖消息(連帶數(shù)據(jù)),可以使用隊(duì)列。

關(guān)于通知器,我們?cè)倏匆粋€(gè)VI:Wait on Notification from Multiple,它方便我們等待多個(gè)通知,實(shí)現(xiàn)多對(duì)一的同步。

05d56e68-3137-11ee-9e74-dac502259ad0.png

2)Queue Operations

下面這個(gè)代碼,實(shí)現(xiàn)的功能和上面Notifier Operations里的例子是一樣的。不同的是這里用的是隊(duì)列(Queue)。隊(duì)列的特點(diǎn)是先進(jìn)先出(FIFO)、緩存數(shù)據(jù)。

前面提到過,如果Loop1沒有100ms等待,使用Notifer Operations是可能會(huì)丟失數(shù)據(jù)的,但是隊(duì)列這里是不會(huì)的。哪怕我們?nèi)コ齃oop1里的100ms等待、在Loop2里加上100ms等待,讓數(shù)據(jù)產(chǎn)生的速度大于數(shù)據(jù)被讀取的速度,也是不會(huì)導(dǎo)致數(shù)據(jù)丟失的,來不及被讀取的數(shù)據(jù)都會(huì)被存儲(chǔ)在隊(duì)列里。

05ec787e-3137-11ee-9e74-dac502259ad0.png

隊(duì)列不能實(shí)現(xiàn)類似Wait on Notification from Multiple的功能。

3)Semaphore

Semaphore,信號(hào)量,是一個(gè)常見且重要的概念。可以簡(jiǎn)單理解為類似紅綠燈(信號(hào)燈)的功能。四個(gè)方向的車都要過十字路口,十字路口又不能同時(shí)過的,它是一個(gè)競(jìng)爭(zhēng)性資源,不同方向的車(線程)對(duì)它的使用存在競(jìng)爭(zhēng)。實(shí)際生活中是怎么辦的呢?誰獲得了綠燈(信號(hào)量)誰就可以通過。 多個(gè)線程訪問競(jìng)爭(zhēng)性資源前,先嘗試獲取信號(hào)量,能夠獲得信號(hào)量的線程有權(quán)使用競(jìng)爭(zhēng)性資源,使用完競(jìng)爭(zhēng)性資源后釋放信號(hào)量(單方向綠燈不能一直亮著啊)。

061cdbf4-3137-11ee-9e74-dac502259ad0.png

此外,對(duì)關(guān)鍵代碼段(Critical Section)也需要使用信號(hào)量進(jìn)行保護(hù)。關(guān)鍵代碼段是指涉及變量或競(jìng)爭(zhēng)性資源訪問的代碼,采用信號(hào)量進(jìn)行管理,以避免多個(gè)線程同時(shí)修改變量或試圖同時(shí)訪問競(jìng)爭(zhēng)性資源。

4)Rendezvous

Rendezvous,集合點(diǎn),比較好理解,大家都到集合點(diǎn)后再出發(fā)。

例如下面這個(gè)代碼:

第一步,創(chuàng)建集合點(diǎn)。集合點(diǎn)大小為2,表示需要等待兩個(gè)任務(wù)到達(dá)集合點(diǎn)代碼才能往下執(zhí)行。

第二步、第三步,在集合點(diǎn)等待,Wait at Rendezvous。當(dāng)Loop1和Loop2的數(shù)據(jù)流都到達(dá)集合點(diǎn)后,Loop1和Loop2才能夠往下繼續(xù)執(zhí)行。

第四步,銷毀集合點(diǎn),釋放內(nèi)存。

0657b21a-3137-11ee-9e74-dac502259ad0.png

5)Occurrences

事件發(fā)生(Occurrences),用于在不同代碼位置或不同線程之間同步活動(dòng)。事件發(fā)生不需要輪詢。 例如以下代碼: 第一步,產(chǎn)生一個(gè)事件發(fā)生(Occurrence)。 第二步,Loop2等待第一步產(chǎn)生的Occurrence。這個(gè)時(shí)候Loop2線程被掛起,只有等待的事件發(fā)生(Occurrence)被Set后這個(gè)線程才會(huì)繼續(xù)執(zhí)行。 第三步,Loop1在完成其它可能的工作后,Set第一步中產(chǎn)生的事件發(fā)生(Occurrence),以使得所有在等待該Occurrence的線程可以繼續(xù)運(yùn)行。

06961b86-3137-11ee-9e74-dac502259ad0.png

6)First Call?、Synchronize Data Flow

First Call?檢查某段代碼或者某個(gè)子VI是否是第一次運(yùn)行。 Synchronize Data Flow用于同步數(shù)據(jù)訪問,它有四個(gè)輸入端,并有四個(gè)輸出端與輸入端一一對(duì)應(yīng)。只有四個(gè)輸入端的數(shù)據(jù)都達(dá)到該VI節(jié)點(diǎn)了,代碼才會(huì)從該節(jié)點(diǎn)繼續(xù)往下執(zhí)行。 例如下面代碼,當(dāng)First Call?檢查到該VI是第一次運(yùn)行時(shí),先等待四個(gè)模擬信號(hào)數(shù)據(jù)(可以是實(shí)際項(xiàng)目中的文件讀取、數(shù)據(jù)采集、系統(tǒng)初始化等工作)都到齊后,再往下執(zhí)行代碼。

06b5cea4-3137-11ee-9e74-dac502259ad0.png

所以下面這個(gè)測(cè)試代碼(ONCE就是上面的VI)里,只會(huì)有一個(gè)Graph控件會(huì)有波形數(shù)據(jù)顯示。另一個(gè)Graph控件的ONCE子VI被判斷為非首次執(zhí)行,沒有波形數(shù)據(jù)產(chǎn)生。

06ca714c-3137-11ee-9e74-dac502259ad0.png

使用好這些同步機(jī)制可以讓我們?cè)O(shè)計(jì)出可靠的應(yīng)用軟件。涉及代碼內(nèi)并發(fā)訪問、多線程、競(jìng)爭(zhēng)性資源使用的,必須采用一定的同步機(jī)制,否則軟件一定會(huì)有出錯(cuò)的時(shí)候——可能暫時(shí)沒發(fā)現(xiàn),但是隱患一直在。





審核編輯:劉清

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

    關(guān)注

    1995

    文章

    3670

    瀏覽量

    333932
  • 緩沖器
    +關(guān)注

    關(guān)注

    6

    文章

    2039

    瀏覽量

    46764
  • 模擬器
    +關(guān)注

    關(guān)注

    2

    文章

    894

    瀏覽量

    44119
  • Graph
    +關(guān)注

    關(guān)注

    0

    文章

    36

    瀏覽量

    9376
  • FIFO存儲(chǔ)
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    6161

原文標(biāo)題:LabVIEW多線程同步機(jī)制

文章出處:【微信號(hào):傳感測(cè)控物聯(lián)網(wǎng),微信公眾號(hào):傳感測(cè)控物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    LabView多線程語言

    LabView多線程語言以前只會(huì)照貓畫虎的寫些簡(jiǎn)單的程序,些基本原理不是很清晰。從網(wǎng)上找了些資料,這里總結(jié)
    發(fā)表于 06-08 10:13

    Linux內(nèi)核同步機(jī)制

    在現(xiàn)代操作系統(tǒng)里,同時(shí)間可能有多個(gè)內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實(shí)象多進(jìn)程多線程編程樣也需要同步機(jī)制
    發(fā)表于 08-06 07:08

    多線程同步機(jī)制在應(yīng)用程序與驅(qū)動(dòng)程序通信中的應(yīng)用

    本文對(duì)Windows NT 操作系統(tǒng)的多線程同步機(jī)制同步對(duì)象進(jìn)行了分析,以其在檢測(cè)儀和經(jīng)緯儀同步通信程序開發(fā)中的應(yīng)用為例,論述了如何通過共享事件來實(shí)現(xiàn)應(yīng)用程序和設(shè)備驅(qū)動(dòng)程
    發(fā)表于 08-24 10:02 ?16次下載

    Win32多線程同步技術(shù)淺析

    簡(jiǎn)要介紹了在Win32環(huán)境多線程訪問共享資源時(shí)的同步機(jī)制,討論了主要的4種同步對(duì)象(臨界區(qū)、互斥元、事件、信號(hào)量),并描述了它們的優(yōu)缺點(diǎn),給出了使用Win32 API函數(shù)操控這4種對(duì)
    發(fā)表于 11-14 10:55 ?31次下載
    Win32<b class='flag-5'>多線程</b><b class='flag-5'>同步</b>技術(shù)淺析

    MFC多線程編程

    計(jì)算機(jī)上的上位機(jī)制作工具語言之MFC多線程編程
    發(fā)表于 09-01 14:55 ?0次下載

    Windows多線程編程入門講解

    計(jì)算機(jī)上的上位機(jī)制作工具語言之Windows多線程編程入門講解,感興趣的可以看看。
    發(fā)表于 09-01 15:27 ?0次下載

    你了解Linux內(nèi)核的同步機(jī)制

    在現(xiàn)代操作系統(tǒng)里,同時(shí)間可能有多個(gè)內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實(shí)象多進(jìn)程多線程編程樣也需要同步機(jī)制
    發(fā)表于 05-12 08:26 ?710次閱讀

    linux多線程機(jī)制-線程同步

    運(yùn)行的線 程,并且要使用同個(gè)緩沖區(qū)進(jìn)行數(shù)據(jù)交換,因此必須利用機(jī)制進(jìn)行同步。通過上面的例子我們可以看到,多線程的最大好處是,除堆棧之外,
    發(fā)表于 04-02 14:42 ?557次閱讀

    Linux多線程編程

    接口,稱為pthread。編寫Linux多線程程序,需要使用頭文件pthread.h,連接時(shí)需要使用庫libpthread.a。順便說一下,Linuxpthread的實(shí)現(xiàn)是通過系
    發(fā)表于 04-02 14:43 ?699次閱讀

    Linux內(nèi)核的同步機(jī)制

    在現(xiàn)代操作系統(tǒng)里,同時(shí)間可能有多個(gè)內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實(shí)像多進(jìn)程多線程編程樣也需要同步機(jī)制
    的頭像 發(fā)表于 09-22 09:46 ?2534次閱讀
    Linux內(nèi)核的<b class='flag-5'>同步機(jī)制</b>

    Linux中多線程編程的知識(shí)點(diǎn)

    Hello、Hello大家好,我是木榮,今天我們繼續(xù)來聊聊Linux中多線程編程中的重要知識(shí)點(diǎn),詳細(xì)談?wù)?b class='flag-5'>多線程中同步和互斥
    發(fā)表于 04-26 17:27 ?712次閱讀
    Linux中<b class='flag-5'>多線程</b>編程的知識(shí)點(diǎn)

    labview AMC多線程

    labview_AMC多線程
    發(fā)表于 08-21 10:31 ?33次下載

    如何使用pthread_barrier_xxx系列函數(shù)來實(shí)現(xiàn)多線程之間的同步

    在Linux系統(tǒng)中提供了多種同步機(jī)制,本文主要講講如何使用pthread_barrier_xxx系列函數(shù)來實(shí)現(xiàn)多線程之間進(jìn)行同步的方法。
    的頭像 發(fā)表于 10-23 14:43 ?1439次閱讀
    如何使用pthread_barrier_xxx系列函數(shù)來實(shí)現(xiàn)<b class='flag-5'>多線程</b>之間的<b class='flag-5'>同步</b>?

    多線程同步的幾種方法

    多線程同步是指在多個(gè)線程并發(fā)執(zhí)行的情況,為了保證線程執(zhí)行的正確性和致性,需要采用特定的方法來
    的頭像 發(fā)表于 11-17 14:16 ?1592次閱讀

    多線程如何保證數(shù)據(jù)的同步

    。本文將詳細(xì)介紹多線程數(shù)據(jù)同步的概念、問題、以及常見的解決方案。 多線程數(shù)據(jù)同步概念 在
    的頭像 發(fā)表于 11-17 14:22 ?1615次閱讀
    主站蜘蛛池模板: 日本三级网站在线线观看 | 特黄免费| xx在线观看| 国产精品天天爽夜夜欢张柏芝 | 日韩免费毛片全部不收费 | 久久瑟 | 日本三级日产三级国产三级 | 第四色激情 | 亚洲产国偷v产偷v自拍色戒 | 天堂bt在线网bt | 欧美影院在线 | 伊人精品久久久大香线蕉99 | bt天堂在线www最新版资源网 | 日本不卡免费高清一级视频 | 九七婷婷狠狠成人免费视频 | 亚洲国产精品网站久久 | 激情综合婷婷丁香六月花 | 女人被免费网站视频在线 | 轻点灬大ji巴太粗太长了h | 久久激情五月 | 亚洲黄页网站 | 国产小视频你懂的 | 高清不卡一区二区三区 | 可以免费观看的一级毛片 | 色爱区综合激情五月综合色 | 国产色综合一区二区三区 | 97夜夜澡人人爽人人喊一欧美 | cijilu刺激 国产 | 天天干天天操天天爽 | 国产叼嘿免费视频网站 | 亚洲第一成网站 | 一级片在线视频 | 色多多拼多多网站 | 九九re | 欧美日韩国产一区二区三区不卡 | 亚洲第一在线视频 | 欧美黄色录像 | 成在线人视频免费视频 | 四虎影院在线观看免费 | 伊人网在线视频观看 | 日韩免费网站 |