什么是VI可重入?
用來設置當前VI是否可以進行多實例並行執行的VI屬性,VI的默認設置為不可重入。
打開VI->Property->Execution 如圖下圖,可以設置相應的配置。
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,那么沒有必要設置可重入,保持默認即可。