Зачем нам нужны события для синхронизации потоков?

Если, например, только 1 поток может получить доступ к Critical Section за раз, зачем нам Events, чтобы синхронизировать 2 потока для чтения / записи через него?


person George Irimiciuc    schedule 29.03.2014    source источник


Ответы (2)


Есть некоторое совпадение в том, как их можно использовать, но есть и некоторые уникальные особенности для обоих:

  1. Критические разделы нельзя использовать в разных процессах, в отличие от событий.
  2. Одно событие ручного сброса может использоваться для одновременного освобождения нескольких потоков. Критическая секция не может.
  3. События совместимы с WaitForSingleObject() и др., А критические разделы - нет.
  4. Поток может ожидать нескольких событий с WaitForMultipleObjects[Ex](), но он может ждать только одного критического раздела (используя другой API).

и так далее.

На самом деле они не находятся в прямой конкуренции; лучше всего думать о них как о дополняющих друг друга.

Мьютексы находятся где-то посередине. Для дальнейшего обсуждения см. В чем разница между мьютексом и критическим разделом ?

person NPE    schedule 29.03.2014
comment
Я знаю, что они дополняют друг друга, но я хочу понять эту конкретную вещь. Зачем нужны ивенты для CS? Разве CS уже не синхронизирует потоки? - person George Irimiciuc; 30.03.2014
comment
@GeorgeIrimiciuc: Ну, вы задаете конкретный вопрос, не давая нам никакого контекста. Это очень затрудняет ответ. - person NPE; 30.03.2014
comment
Хм, контекстом были бы два потока, использующие CS для чтения и записи поочередно. CS уже альтернативно их блокирует, так зачем нам события для полной синхронизации? - person George Irimiciuc; 30.03.2014
comment
События @GeorgeIrimiciuc позволяют вам блокировать и ждать, пока что-то не произойдет, чего нет в критическом разделе. Часто ждут общего ресурса, который нужно защитить, например, критический раздел. - person nos; 30.03.2014

У событий есть функция SetEvent, которая позволяет использовать их как сигнал. Например, когда один поток завершил чтение файла или заполнение буфера, он может SetEvent запустить другой поток на следующем этапе обработки этих данных.

person ScottMcP-MVP    schedule 29.03.2014