關於物件導向的方法並行執行的問題

Stephen_Young發表於2024-07-13

LabVIEW的從同一個類例項化的多個物件如何執行各自的方法呢?

這幾天跟同事討論到LabVIEW的物件導向程式設計中,如果我設計的一個類有一個方法比較耗時,那麼當我例項化多個物件時,那麼這個耗時的方法是怎麼執行的呢?是各自並行執行還是,必須等某一個物件的方法呼叫完,接下來呼叫第二個物件的該方法呢?

接下來,我們直接來做個試驗吧!

試驗設計:

我們設計一個類——Person

該類包含的一個描述其狀態的私有資料——State;

有對該資料的讀寫的介面;

有一個耗時的方法——WalkAWay

好了,類的程式設計完了,我們做一個Main.vi來進行測試:

我們看下執行的結果:

該Main程式共計耗時為2個物件的Walk方法執行時間之和:2000+1500=3500ms;

由此,我們可以看到,預設設計的類,其方法在各個物件間是序列執行的;

接下來,重點:

我們回去修改下我們設計的類的WalkAWay方法。

然後再執行Main測試vi,執行結果:

該Main程式共計執行時間為最長按個WalkAWay方法執行的時間:2000ms.我們可以看到,這次就是並行執行了WalkAWay方法了。

至此,我們可以得出結論:

預設設計的類的方法是序列執行的。那麼,如果有耗時的程式,我們可以透過調整方法的共享副本可重入屬性來實現不同物件間呼叫方法並行執行。這個能大大節約程式執行時間,尤其是我們在多slot並行測試的軟體設計時尤為重要。

說明:上述如果將方法vi的設定為第三個——預分配副本的話,類的設計會直接報錯,也就是說LabVIEW不讓我們這麼設定。

附件:vi的可重入屬性的說明:

Non-reentrant execution
不可重入: 多個呼叫者呼叫此VI時,是按照順序逐一呼叫的。優勢是最小的記憶體消耗,同時也會使得所有呼叫該VI的共享一個狀態,在呼叫中保留控制元件和未被初始化移位暫存器的值。

Shared clone reentrant execution
可重入:在例項間共享副本(減少記憶體使用),允許多個呼叫者同步並行執行該VI,這個型別的可重入,為了減少記憶體消耗,在呼叫中複用克隆副本。

當呼叫者B呼叫該VI時,如果克隆例項正在被呼叫者A使用中,那麼LabVIEW 會分配一個新的克隆例項給呼叫者B。

當呼叫者B呼叫該VI時,如果克隆例項沒有被使用,那麼LabVIEW不會再開闢新的克隆例項。因此每個呼叫者維護自己的狀態,保留控制元件和未賦值移位暫存器的值

Preallocated clone reentrant execution
可重入:為各個例項預分配副本,允許多個呼叫者同步並行執行該VI,這個型別的可重入,為每一個例項預分配獨立克隆例項,並以開闢更多的克隆例項為代價。

那麼VI何時使用可重入,並且到底選共享副本還是各個例項預分配副本?

場景和原則

  1. 當VI中有使用全域性變數、或者功能全域性變數時,不能設定成---->可重入:在例項間共享副本(減少記憶體使用)

  2. 如讀取檔案一類時,可以考慮設定可重入,使得呼叫者可以並行執行,提高效率。

  3. 當需要實現一些,共享克隆例項時,可以考慮使用--->可重入:在例項間共享副本(減少記憶體使用) 例如 遞迴操作。

  4. 如果VI克隆例項暫用資源很小,但是執行時間較長,可以考慮使用---->可重入:為各個例項預分配副本

  5. VI可重入設定,是為多執行緒呼叫準備的,如果在該VI被呼叫過程中,不會出現多執行緒呼叫該VI,那麼沒有必要設定可重入,保持預設即可。
    引用自:https://www.cnblogs.com/YourDirection/p/12833877.html

相關文章