Sobes.tech
Junior — Middle

Ποιος είναι ο σκοπός του μηχανισμού σημαφόρου στον πολυνηματικό προγραμματισμό;

sobes.tech AI

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

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

Παράδειγμα σε Go με χρήση καναλιού ως σημαφόρου:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    sem := make(chan struct{}, 3) // σημαφόρος με μέγιστο μετρητή 3

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // απόκτηση πόρου
            fmt.Printf("Goroutine %d ξεκίνησε\n", id)
            // προσομοίωση εργασίας
            // time.Sleep(time.Second)
            fmt.Printf("Goroutine %d ολοκλήρωσε\n", id)
            <-sem // απελευθέρωση πόρου
        }(i)
    }

    wg.Wait()
}

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