Они НЕ то же самое. Они используются в различных целях!
, В то время как оба типа семафоров имеют полное/пустое состояние и используют тот же API, их использование очень отличается.
Семафоры Взаимного исключения
семафоры Взаимного исключения используются для защиты совместно используемых ресурсов (структура данных, файл, и т.д.).
Взаимоисключающий семафор А "принадлежит" задаче, которая берет его. Если Задача B будет делать попытку к semGive взаимного исключения, в настоящее время сохраненного Задачей A, то вызов B Задачи возвратит ошибку и сбой.
Взаимные исключения всегда используют следующую последовательность:
- SemTake - Critical Section - SemGive
Вот простой пример:
Thread A Thread B Take Mutex access data ... Take Mutex <== Will block ... Give Mutex access data <== Unblocks ... Give Mutex
Двоичный Семафор
Двоичный Семафор обращаются к полностью различному вопросу:
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
Примечание, что с двоичным семафором, для B нормально брать семафор и для предоставления его.
Снова, двоичный семафор НЕ защищает ресурс от доступа. Действие Предоставления и Взятия семафора существенно разъединяется.
Это обычно имеет мало смысла для той же задачи к так даванию и взятию на том же двоичном семафоре.
strString = "test"
For i=1 To Len(strString)
WScript.Echo Mid(strString,i,1)
Next