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)