Сегодня коротко расскажу о том, как я реализовывал семафор на основании объекта синхронизации «Событие».
Сначала пройдусь по определениям.
1. Что такое синхронизация и зачем она нужна?
Очевидно, что набор действий мы можем выполнять несколькими способами. Самые простые — последовательно и параллельно. Параллельности выполнения определенных действий можно достигнуть за счет запуска различных потоков (threads). Идея простая: назначаем каждому потоку какое-то элементарное (или не очень) действие и запускаем их в определенном порядке. Вообще говоря, запустить мы их можем и все одновременно — выигрыш по времени мы, конечно, получим. Это понятно: одно дело вывести 10 000 слов одно за другим, а другое дело одновременно выводить, например, 100 слов. 100-кратный выигрыш по времени (плюс-минус, без учета задержек и проч.). Но исходная задача может предполагать строгую последовательность действий.
Например:
- Открыть файл
- Записать текст в файл
- Закрыть файл
Пример специально взят тепличный (понятно, что никакой параллелизм тут не нужен, все можно просто выполнить последовательно), но в качестве учебной задачи он вполне сойдет, а главное, на его примере отлично видна потребность в последовательном выполнении. Или вот другой пример, немного отличающийся:
- Сгенерировать три последовательности случайных чисел
- Последовательно вывести их на экран
Здесь первый пункт можно выполнять одновременно тремя разными потоками, а вот последний, вывод, нужно делать последовательно, причем только после отработки первого пункта.
В общем, задачи на параллелизм могут быть самые разные и для синхронизации потоков нужен какой-то инструмент.