Многопоточность: Примитив синхронизации Semaphore🚦



Семафоры помогают управлять доступом к общему ресурсу нескольким потокам.

Семафор состоит из очереди потоков и значения счетчика.



ℹ️Очередь потоков используется семафором для отслеживания ожидающих потоков в порядке FIFO



ℹ️Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. Значение счетчика изменяется, когда мы вызываем функцию signal() или wait().



Когда мы должны вызывать функции wait() и signal()?

- Вызов wait() нужен каждый раз перед использованием общего ресурса. По сути, мы спрашиваем семафор, доступен ли общий ресурс или нет. Если нет, будем ждать.



- Вызов signal() нужен каждый раз после использования общего ресурса. По сути, мы сигнализируем семафору, что закончили взаимодействие с общим ресурсом.



🚧 НИКОГДА не запускайте функцию семафора wait() в основном потоке, так как это приведет к зависанию вашего приложения.