Delphi. Потоки. Семафоры

Данная статья посвящена моим экспериментам с семафорами в Windows программировании. В принципе, после изучения потоков, критических секций, событий, мютексов – осваивать семафоры было относительно легко, но всё же нюансы были.

Что такое семафоры?

Это объекты, которые ограничивают доступ к участку кода несколькими потоками. Потоки могут быть в одном или нескольких процессах. В отличие от мютексов при использовании семафоров – с участками кода могут работать несколько потоков, а в мютексах только один. В остальном мютексы и семафоры похожи.

Практика

Напишем небольшую программу, которая будет иллюстрировать действие семафоров, выглядеть она будет вот так…

28

Первый поток будет записывать данные – остальные -считывать, подхватывать на том месте, где было значение ProgressBar1.Position в момент нажатия на Start2, например, и выставлять ProgressBar2.Position в такое же значение, а далее – следовать за ProgressBar1.Position по пятам. Каждый ProgressBar в отдельном потоке.

Я заметил, что если использовать код без семафоров, то если запустить 4 потока сразу – начинаются жуткие тормоза. Возможно это не оптимизирован код, но это как раз то, что нужно для иллюстрации семафоров.

Итак перейдем к написанию кода.

Добавим в uses syncobjs

далее, в разделе type создадим 4 класса потоков

Далее, опишем глобальные переменные

В FormCreate создадим Семафор

Здесь обратите внимание, второй и третий параметры поставлены в единицу. Это значит, что мы можем максимально допустить ещё один поток. То есть, у нас будут заполняться 2 шкалы. Одна пишущая, другая читающая. Нажатие на кнопки Start оставшихся 2 шкал ничего не дадут. Чтобы допустить большее число потоков – нужно изменить эти числа, на необходимые.

Процедура для первого пишущего потока

Процедура для всех остальных читающих потоков

Далее процедуры Execute всех потоков

Далее вызов потоков на кнопках

В принципе это вся программа. Жмем на Start1, далее на любую кнопку из Start1, Start2, Start3. В данном случае мы использовали потоки внутри приложения, но также можно было бы использовать потоки из разных приложений, использующих один и тот же ресурс. Суть семафоров – в управлении “популяцией” потоков, имеющих доступ к разделяемым ресурсам.

This entry was posted in Delphi. Bookmark the permalink.