天天看點

《并行計算的程式設計模型》一2.3.4 鎖與中斷

在2.2.2節中,講到GASNet可以在用戶端并行執行AM處理程式,即使用戶端是單線程的。而且多線程用戶端在執行過程中需要避免并行調用GASNet的屏障函數。是以本節将重點介紹GASNet的控制并發機制。

GASNet提供了專門的接口處理線程安全性,由于存在多線程執行GASNet的可能,這種接口對于單線程用戶端非常重要。其中主要的機制是一個簡單的互斥鎖,稱作“處理程式安全鎖”或“HSL”,資料類型為基于互斥鎖類型的gasnet_hsl_t類型。目的是為了確定該互斥鎖類型适合于給定的程式實作(其中包括GASNet用戶端與其實作都為單線程時無操作的情況)。

除了GASNet規範中提及的細節描述外,上述函數與pthread_mutex_t中的常量、函數非常相似。同POSIX線程一樣,這些操作能夠防止對資料結構或代碼進行并行通路。關于互斥鎖的使用方法不在本章讨論的範圍之内。需要注意的是,上述操作為節點本地的互斥鎖,且GASNet沒有提供跨節點互斥處理機制。但是2.6.5節的示例将會講到如何使用AM實作一個著名的互斥共享記憶體算法。

除前文中介紹的用于執行用戶端AM處理程式的内部線程方法之外,GASNet規範允許出現中斷驅動實作情況。雖然寫本書時尚未出現這樣的應用實作,但是這裡簡要地介紹一下相關概念。

上述的兩個函數通常成對使用,它們定義了線程上不能被AM處理程式執行過程中斷的代碼段。這與使用HSL方式避免多線程并行通路給定代碼或資料有較大的不同。無中斷部分主要用于保護可能由用戶端處理程式和非處理程式通路的非重入用戶端代碼。無中斷部分使用較少有兩個主要原因:(1)使得HSL能夠隐式通路無中斷部分;(2)AM處理程式在隐式無中斷部分執行。注意如果存在動态循環嵌套操作,那麼上述函數不必嵌套,是以用戶端主要負責無中斷部分。

在使用GASNET_SEQ建構時,當且僅當GASNet實作既不使用線程也不使用内部中斷執行用戶端處理程式時,不需要編譯互斥調用。

繼續閱讀