Добрый вечер, коллеги-укладчики, у меня мьютекс и связанный вопрос о
// ¦ = 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|
Ситуация
Является ли эта ситуация безопасной или жизнеспособной?
У меня есть 5 сабовподпрограммы в VB.NET, и я могу запускать их в 2 группах, состоящих из отдельных подмножеств асинхронным потоком.
Однако, как показывает ужасно грубый текстовый график, работа мьютекса над подмножеством B
Логика
Группе A и B приходится ждать друг друга, если задания были запущены либо - A & B GROUP MUTEX
помогает держать это под контролем.
ВнутриГруппа A может выполнять обе процедуры одновременно (B придется ждать завершения A1 и A2).
Группа B, в которой B1, B2 и B3 могут запускать B1 одновременно с любой из них.B2 и B3, но B2 и B3 не могут работать одновременно , поэтому проверка подмножества MUTEX
.
Обновление: @pstrjds хорошо подошла к вопросу с помощью синхронизации вместо:причина, по которой я использую Mutex, а не блокировку синхронизациик тому, что мне нужно сделать этот процесс многопользовательским безопасным, так как в подпрограммах много SQL и операций на основе данных, которые требовали блокировки программы, в то время как несколько SQL-транзакций выполняются в разных базах данных на 3 разных серверах, чтобыобновляйте их одновременно и безопасно - обработка транзакций в SQL выполнена и работает хорошо, отсюда и разбитый псевдо-код.@pstrjds правильно говорит, что это использует потоки, порожденные одним классом, однако в подпрограммах он вызывает веб-службу (часть работы группы B в 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
Справка!
ЧтоЯ хотел бы спросить, является ли вложение мьютекса возможной проблемой, если это плохая практика и что есть лучший способ реализовать это, используя многопоточную систему.