Sobes.tech
Back to questions
Junior — Middle
101

Может ли объяснить, что представляет собой механизм семафора в программировании и как он используется для синхронизации потоков?

Answer from AI

sobes.tech AI

Семафор — это механизм синхронизации, который используется для управления доступом нескольких потоков к ограниченному ресурсу.

Он содержит счётчик, который показывает, сколько потоков могут одновременно получить доступ к ресурсу. Когда поток хочет войти в критическую секцию, он выполняет операцию "wait" (или P), уменьшая счётчик. Если счётчик становится меньше нуля, поток блокируется. Когда поток выходит из критической секции, он выполняет операцию "signal" (или V), увеличивая счётчик и разблокируя ожидающие потоки.

Пример использования семафора в C++ с POSIX API:

#include <semaphore.h>
#include <pthread.h>
#include <iostream>

sem_t semaphore;

void* worker(void* arg) {
    sem_wait(&semaphore); // захват ресурса
    std::cout << "Поток работает\n";
    // работа с ресурсом
    sem_post(&semaphore); // освобождение ресурса
    return nullptr;
}

int main() {
    sem_init(&semaphore, 0, 3); // разрешаем одновременно 3 потока
    pthread_t threads[5];
    for (int i = 0; i < 5; ++i) {
        pthread_create(&threads[i], nullptr, worker, nullptr);
    }
    for (int i = 0; i < 5; ++i) {
        pthread_join(threads[i], nullptr);
    }
    sem_destroy(&semaphore);
    return 0;
}

Таким образом, семафор позволяет ограничить число потоков, одновременно работающих с ресурсом, предотвращая гонки и обеспечивая корректность.