Sobes.tech
Junior — Middle

Môžete vysvetliť, čo je mechanizmus semafora v programovaní a ako sa používa na synchronizáciu vlákien?

sobes.tech AI

Odpoveď od AI

Semafor je mechanizmus synchronizácie, ktorý sa používa na riadenie prístupu viacerých vlákien k obmedzenému zdroju.

Obsahuje čítač, ktorý ukazuje, koľko vlákien môže súčasne pristupovať ku zdroju. Keď vlákno chce vstúpiť do kritickej sekcie, vykoná operáciu "wait" (alebo P), čím zníži čítač. Ak sa čítač stane záporným, vlákno je zablokované. Keď vlákno opustí kritickú sekciu, vykoná operáciu "signal" (alebo V), čím zvýši čítač a odblokuje čakajúce vlákna.

Príklad použitia semaforu v C++ s POSIX API:

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

sem_t semaphore;

void* worker(void* arg) {
    sem_wait(&semaphore); // získanie zdroja
    std::cout << "Vlákno pracuje\n";
    // práca so zdrojom
    sem_post(&semaphore); // uvoľnenie zdroja
    return nullptr;
}

int main() {
    sem_init(&semaphore, 0, 3); // povolíme súčasnú prácu 3 vlákien
    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;
}

Týmto spôsobom semafor obmedzuje počet vlákien, ktoré pracujú súčasne s daným zdrojom, zabraňuje súťažiam a zabezpečuje správnosť.