晚上好同胞堆垛機,我有一個互斥體和螺紋相關問題有關Visual Basic中 - 使用嵌套互斥鎖在一個線程應用程序 - 風險和建議
// ¦ = Run one or the other per call to routine
|GROUP A| GROUP B |
| A & B GROUP MUTEX |
|=======|============|
|A1 & A2¦ B1 & |B2|B3|
|MUTEX|
|==|==|
|B2¦B3|
形勢
是這種情況下的安全還是可行?
我在VB.NET中有5個子例程,我可以以異步線程方式在兩組中包含單獨的子集運行它們。
但是,正如上面可怕的粗糙的文本 - 圖形所示,互斥體在子集B上的工作也是如此。
邏輯
A,B組有等待的海誓山盟如果作業已經開始在任 - A & B GROUP MUTEX
有助於保持這檢查。
組內A組都可以同時開始例程(B將不得不等待A1和A2都完成)。
B組,以B1,B2和B3可以在相同的時間或者B2和B3但B2和B3不能同時運行,因此該子集MUTEX
檢查運行B1。
更新: @pstrjds做用好點同步鎖定,而不是:我使用的原因互斥的,而不是同步鎖定是由於這樣的事實,我需要這個過程中多用戶安全的,因爲內子例程是很多基於SQL和數據的操作,它們需要程序被鎖定,同時在3個不同的服務器上的不同數據庫上執行多個SQL事務以同時並安全地更新它們 - SQL中的事務處理已完成且運行良好分解的僞代碼。 @pstrjds說這是使用從一個類生成的線程是正確的,但是在它調用Web服務(B2組和B3組中的一部分工作)的子例程中,它更新了單獨的第三方服務器。 </Wall-o-Text>
僞代碼
不幸的是確切的代碼是很長,但我使用這種結構:
Sub AGroup_Method()
Dim bln_FirstInstance As Boolean
Using objABMutex As New Mutex(True, "Global\AB_MutexLock", blnFirstInstance)
If bln_FirstInstance Then
//Start Threads for subroutine A1 And then A2
StartThread_A1()
StartThread_A2()
Else
//Post that Group A subroutine needs to wait for Group B
End If
End Using
End Sub
Sub BGroup_Method(Byval p_blnRunBTwo as Boolean)
Dim bln_FirstInstance As Boolean
Dim blnBGroup_FirstInstance As Boolean
Using objABMutex As New Mutex(True, "Global\AB_MutexLock", bln_FirstInstance)
If bln_FirstInstance Then
//Do subroutine group B
//Start B1
StartThread_B1()
Using objBGroupMutex As New Mutex(True, "Global\BGroup_MutexLock", blnBGroup_FirstInstance)
If p_blnRunBTwo
If blnBGroup_FirstInstance Then
//Wait for mutex from B3 and then run B2
StartThread_B2
End If
Else
If blnBGroup_FirstInstance Then
StartThread_B3
End If
End If
End Using
Else
//Post that Group B subroutine needs to wait for Group A
End If
End Using
End Sub
幫助!
我想問的是如果互斥體嵌套是一個可能的問題,如果它是不好的練習whatnots,並有沒有更好的方式來實現這個使用線程系統。
除非你需要這些互斥體是進程間,你就不需要使用命名的互斥體,而你只需要「全球\」,如果你使用的是命名的互斥體在您需要保護的東西終端服務環境在同一個系統上的多個用戶(即寫入日誌文件或類似這種事情) – pstrjds 2010-11-17 13:36:45
@pstrjds您是與進程間的一聲,原來原因互斥體,以允許它通過對每個用戶同時運行系統,帶有標誌A組,B2或B3選項的標誌。寫日誌也是用戶名和會話相關的,所以它們被安全地命名而不會出現鎖定問題。 – 2010-11-17 14:05:54
剛擡起頭對全球命名的互斥體,然後,你可以跑進不會讓他們創建互斥用戶的權限問題,你還需要有適當的MutexAccessRule創建您的具體情況,以便其他用戶比創造者是能夠訪問它。 – pstrjds 2010-11-17 14:38:48