Sobes.tech
Junior — Middle

Μπορείτε να εξηγήσετε τι είναι ένας μηχανισμός σημαφόρου στον προγραμματισμό και πώς χρησιμοποιείται για τον συγχρονισμό νημάτων;

sobes.tech AI

Απάντηση από AI

Ο σημαφόρος είναι ένας μηχανισμός συγχρονισμού που χρησιμοποιείται για τον έλεγχο της πρόσβασης πολλαπλών νημάτων σε έναν περιορισμένο πόρο.

Περιέχει έναν μετρητή που δείχνει πόσα νήματα μπορούν ταυτόχρονα να έχουν πρόσβαση στον πόρο. Όταν ένα νήμα θέλει να εισέλθει στην κρίσιμη ενότητα, εκτελεί την λειτουργία "wait" (ή P), μειώνοντας τον μετρητή. Αν ο μετρητής γίνει αρνητικός, το νήμα μπλοκάρεται. Όταν το νήμα βγει από την κρίσιμη ενότητα, εκτελεί την λειτουργία "signal" (ή V), αυξάνοντας τον μετρητή και ξεμπλοκάροντας τα αναμονή νήματα.

Παράδειγμα χρήσης σημαφόρου σε C++ με API POSIX:

#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;
}

Έτσι, ο σημαφόρος περιορίζει τον αριθμό των νημάτων που εργάζονται ταυτόχρονα με έναν πόρο, αποτρέποντας συνθήκες αγώνα και διασφαλίζοντας την ορθότητα.