Чем отличается мьютекс от двоичного семафора?
Чем отличается мьютекс от двоичного семафора?
ну не знаю, что там с двоичными, а вообще - семафор - позволяет остановить выполнение потока до тех пор, пока он не получит сигнала от другого потока о том, что работу можно продолжать. т. е. позволяет блокировать одновременное выполнение потоков, которым вместе выполняться нельзя. а Мьютекс - служит для совместного использования неких данных. т. е. он не блокирует выполнение другого потока впринципе, но запрещает прерывать текущий поток до выполнения некоторых действий (скажем запись в файл). короче типа критических секций, но мьютекс может синхронизировать действия потоков в рамках разных процессов.
короче см. Чарльза Петцольда :-)
ну не знаю, что там с двоичными, а вообще - семафор - позволяет остановить выполнение потока до тех пор, пока он не получит сигнала от другого потока о том, что работу можно продолжать. т. е. позволяет блокировать одновременное выполнение потоков, которым вместе выполняться нельзя. а Мьютекс - служит для совместного использования неких данных. т. е. он не блокирует выполнение другого потока впринципе, но запрещает прерывать текущий поток до выполнения некоторых действий (скажем запись в файл). короче типа критических секций, но мьютекс может синхронизировать действия потоков в рамках разных процессов.
короче см. Чарльза Петцольда :-)
Я не имел ввиду конкретно Windows. Имел ввиду классические определения мьютекса и семафора.
Вобще двоичный семафор - это переменная, которая может принимать значения 0 или 1. Мьютекс - это переменная, которая может принимать значения 0 или 1. Это конечно все условно...блокирован, не блокирован. Тогда получается, что это одинаковые вещи. Если мы мьютекс будем использовать для синхронизации двух потоков - это уже получится двоичный семафор. Если мы двоичный семафор будем использовать для совместного использования некоторых данных - это уже будет мьютекс. Получается, различия только в реализации.
[QUOTE]Originally posted by squirL
Я не имел ввиду конкретно Windows. Имел ввиду классические определения мьютекса и семафора.
Вобще двоичный семафор - это переменная, которая может принимать значения 0 или 1. Мьютекс - это переменная, которая может принимать значения 0 или 1. Это конечно все условно...блокирован, не блокирован. Тогда получается, что это одинаковые вещи. Если мы мьютекс будем использовать для синхронизации двух потоков - это уже получится двоичный семафор. Если мы двоичный семафор будем использовать для совместного использования некоторых данных - это уже будет мьютекс. Получается, различия только в реализации.
если брать общий случай, то если честно, я не встречался с классическими определениями мьютекса.
есть понятие блокирующих переменных и понятие семафора (т.е. это не одно и тоже), введенное Дейкстрой, которое в общем случае выглядит так:
Существуют два примитива.
В абстрактной форме эти примитивы, обозначаемые к примеру INC и DEC, оперируют над целыми неотрицательными переменными, называемыми семафорами. Пусть S такой семафор. Операции определяются следующим образом:
INC(S) : переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.
DEC(S) : уменьшение S на 1, если это возможно. Если S=0, то есть невозможно уменьшить S и остаться в области целых неотрицательных значений. тогда процесс, вызывающий DEC-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.
я так подозреваю, что мьютекс в классическом смысле - частный вид семафора. или двоичный семафор, как вы его называете.