Mutex против событий в Windows - PullRequest
       3

Mutex против событий в Windows

11 голосов
/ 02 августа 2011

Может кто-нибудь объяснить, в чем разница, если я сделаю

mutex = createMutex
waitForSingleObject
Release(mutex)

и

event = createEvent
waitForSingleObject
Release(event)

Я так растерялся, могу ли я использовать обе версии для синхронизации? заранее спасибо за любую помощь

Ответы [ 2 ]

12 голосов
/ 02 августа 2011

Вы используете мьютекс, чтобы обеспечить доступ только к одному потоку выполнения. Например, если вы хотите обновить список, который потенциально может использоваться несколькими потоками, вы должны использовать мьютекс:

acquire mutex
update list
release mutex

С мьютексом только один поток может одновременно выполнять "список обновлений".

Вы используете событие ручного сброса, если хотите, чтобы несколько потоков подождали чего-то, прежде чем продолжить. Например, вы запустили несколько потоков, но все они приостановлены, ожидая какого-то другого события, прежде чем они смогут продолжить. Как только это событие произойдет, все потоки могут начать работать.

Основной поток будет выглядеть так:

create event, initial value false (not signaled)
start threads
do some other initialization
signal event

Код каждого потока будет:

do thread initialization
wait for event to be signaled
do thread processing
1 голос
/ 02 августа 2011

Да, оба могут использоваться для синхронизации, но по-разному.

Мьютекс является объектом взаимного исключения и может быть получен только одним экземпляром за раз.Он используется, чтобы избежать одновременного использования общего ресурса, такого как глобальная переменная, кусками компьютерного кода

Событие - это объект, который можно явно установить в состояние путем использованияфункции SetEvent.

...