Семафор На Событиях C++

Сегодня я кратко расскажу о том, как я реализовал семафор на основе объекта синхронизации «Событие».

Сначала я пройдусь по определениям.



1. Что такое синхронизация и зачем она нужна?

Очевидно, что мы можем выполнить набор действий несколькими способами.

Самыми простыми являются последовательные и параллельные.

Параллельного выполнения определенных действий можно добиться путем запуска разных потоков.

Идея проста: мы назначаем каждому потоку какое-то базовое (или не очень) действие и запускаем их в определенном порядке.

Вообще говоря, мы можем запустить их все одновременно — выигрыш во времени, конечно, получим.

Это понятно: одно дело отображать 10 000 слов друг за другом, а другое дело одновременно отображать, например, 100 слов.

Выигрыш во времени в 100 раз (плюс-минус, без учета задержек и т.п.

).

Но исходная задача может требовать строгой последовательности действий.

Например:

  • Открыть файл
  • Записать текст в файл
  • Закрыть файл
Пример сознательно взят как парниковый (понятно, что никакой параллелизм здесь не нужен, просто все можно делать последовательно), но в качестве обучающей задачи он вполне подходит, а главное, его пример наглядно показывает необходимость последовательного выполнения.

.

Или вот другой пример, немного другой:

  • Сгенерируйте три последовательности случайных чисел
  • Отображать их последовательно
Здесь первый пункт может выполняться одновременно тремя разными нитями, а вот последний, вывод, необходимо делать последовательно и только после выполнения первого пункта.

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

2. Инструменты для синхронизации потоков

Windows.h реализует довольно много стандартных инструментов синхронизации (так называемых «объектов синхронизации»).

Среди основных: критическая область, событие, мьютекс, семафор.

Да-да, реализация семафора в windows.h уже есть.

«Так зачем это программироватьЭ» - ты спрашиваешь.

Ну, во-первых, чтобы лучше понять, как это работает. А, во-вторых, дополнительная практика C++ еще никому не помешала :) Учитывая, что мы будем использовать События, давайте объясним, что они собой представляют и как их использовать.

События используются для уведомления ожидающих потоков.

То есть, по сути, это некий сигнал для потока – может он работать или еще нет. Из самого смысла этого объекта следует, что он имеет определенное состояние сигнала и возможность его настройки (сброс/"включение").

Итак, после подключения windows.h мы можем создать событие с помощью:

   

HANDLE CreateEvent (

Теги: #C++ #Параллельное программирование #параллельные вычисления #синхронизация #семафор #windows.h
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.