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ť.