Sobes.tech
Middle

რა არის სემაფორი პროგრამირების კონტექსტში?

sobes.tech AI

პასუხი AI-სგან

სემაფორი — ეს არის სიგნალიზაციის პრიმიტივი, რომელიც მართავს ნაკადი ნაკადის წვდომას შეზღუდულ რესურსზე. იგი ინახავს მთელ რიცხვს.

ძირითადი ოპერაციები:

  • wait() (ან P / acquire): ამცირებს გამოთვლას 1-ით. თუ გამოთვლა უარყოფითია, ნაკადი ბლოკირდება, სანამ სხვა ნაკადი არ შეასრულებს signal()-ს.
  • signal() (ან V / release): ზრდის გამოთვლას 1-ით. თუ ბლოკირებული ნაკადები არსებობს, ერთ-ერთი მათგანი განბლოკდება.

სემაფორების ტიპები:

  • ბინარული სემაფორი (მიუტექსი): გამოთვლას იღებს მნიშვნელობებს 0 ან 1. გამოიყენება ურთიერთგამორიცხვის უზრუნველსაყოფად — მხოლოდ ერთი ნაკადი შეიძლება მიიღოს წვდომა რესურსზე ერთდროულად.
  • ანგარიშის სემაფორი: გამოთვლას შეუძლია მიიღოს მნიშვნელობები 0-დან N-მდე. გამოიყენება რესურსების პულზე წვდომის მართვისთვის, სადაც შეზღუდული რაოდენობაა.

Swift-ის მაგალითი — ერთდროულად მუშაობა შესაძლებელი სამუშაოების რაოდენობის შეზღუდვა:

// სემაფორის შექმნა, რომელიც საშუალებას აძლევს 3 ერთდროულ სამუშაოს
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // დავალება 1
    semaphore.wait() // გამოთვლის შემცირება, ბლოკავს თუ > 3 სამუშაოა
    print("დავალება 1 დაიწყო")
    Thread.sleep(forTimeInterval: 2) // მუშაობის იმიტაცია
    print("დავალება 1 დასრულდა")
    semaphore.signal() // გამოთვლის გაზრდა, მოლოდინში მყოფ დავალებებს განბლოკვა
}

DispatchQueue.global().async {
    // დავალება 2
    semaphore.wait()
    print("დავალება 2 დაიწყო")
    Thread.sleep(forTimeInterval: 3)
    print("დავალება 2 დასრულდა")
    semaphore.signal()
}

DispatchQueue.global().async {
    // დავალება 3
    semaphore.wait()
    print("დავალება 3 დაიწყო")
    Thread.sleep(forTimeInterval: 1)
    print("დავალება 3 დასრულდა")
    semaphore.signal()
}

DispatchQueue.global().async {
    // დავალება 4 (მოიცდის, სანამ სლოტი თავისუფალი იქნება)
    semaphore.wait()
    print("დავალება 4 დაიწყო")
    Thread.sleep(forTimeInterval: 2)
    print("დავალება 4 დასრულდა")
    semaphore.signal()
}

// ველით ყველა დავალების დასრულებას — დემონსტრაციისთვის
// გამოიყენეთ უფრო საიმედო მექანიზმები მოლოდინისთვის
Thread.sleep(forTimeInterval: 5)