Вступление Каждый программист, который интересовался параллельным программированием(а оно становиться необходимым в современном мире), слышал про проблему совместного использования ресурса несколькими потоками. Это приводит к взаимным блокировкам, data race и другим проблемам, которые либо замедляют, либо ломают нашу программу. Чтобы избежать всего этого и были придуманы примитивы синхронизации. Два из них мы сегодня разберём. Семафор Семафор своё название получил из-за того, что управляет потоками. Указывает кому можно войти в синхронизированную область, а кому нельзя. Используется в том случае, когда нужно дать доступ к ресурсу нескольким потокам. Например, нам нужно сделать так, чтобы наш сервер мог обрабатывать только 10 соединений, а остальные закрывал. Как это работает? Внутри семафора есть переменная, которая отвечает за количество потоков, которые могут зайти в синхронизированную область. Обычно задаётся при инициализации. Важно, чтобы эта переменная была атомарной, то есть,