Middle+
როგორ მუშაობს mutex კორუტინებში?
sobes.tech AI
პასუხი AI-სგან
მიუტექსი (Mutex) კუროტინებში უზრუნველყოფს ურთიერთგამორიცხვის მექანიზმს საერთო რესურსების დაცვისთვის ერთდროულად რამდენიმე კუროტინის მიერ წვდომისგან.
მუშაობის პრინციპი:
- მიუტექსის დაკავება: კუროტინი, რომელიც სურს მიიღოს წვდომა დაცულ რესურსზე, იძახის მეთოდს
lock(). - ბლოკირება: თუ მიუტექსი თავისუფალია, კუროტინი ბლოკირებამდე არ ბლოკავს და აგრძელებს მუშაობას. თუ მიუტექსი დაკავებულია სხვა კუროტინის მიერ, იძახის კუროტინი შეჩერდება მანამდე, სანამ მიუტექსი არ გათავისუფლდება.
- მიუტექსის გათავისუფლება: სამუშაო დასრულების შემდეგ, კუროტინი იძახის მეთოდს
unlock(), რათა გათავისუფლოს მიუტექსი.
კუროტინებში ძირითადი მახასიათებლები:
- ბლოკირებადი
lock()(თავისუფალი მიუტექსის დაკავებისას): ტრადიციული ნაკადებისგან განსხვავებით, სადაცlock()შეიძლება ბლოკავდეს მთელ ნაკადს, კუროტინებში, თუ მიუტექსი თავისუფალია, დაკავება ხდება ბლოკირებამდე არაუფერხებლად. - კუროტინის შეჩერება (დაკავებული მიუტექსის დროს): თუ მიუტექსი დაკავებულია, იძახის კუროტინი არ ბლოკავს ნაკადს, არამედ შეჩერდება მის გათავისუფლებამდე. ეს თავისუფლედ ხდის ნაკადს სხვა კუროტინებისთვის.
- გაგრძელების ფუნქცია
withLock: მოსახერხებელი მეთოდი მიუტექსის გამოყენებისთვის, რომელიც ავტომატურად იძენს და გათავისუფლებს მას, თუნდაც ბლოკის შიგნით გამონაკლისის შემთხვევაშიც.
გამოყენების მაგალითი:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// კრიტიკული სექცია - დაცული რესურსი
counter++
delay(10) // იმიტაცია სამუშაოს
println("Counter: $counter")
} // მიუტექსი ავტომატურად გათავისუფლებულია აქ
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
ამ მაგალითში incrementCounter არის კრიტიკული სექცია, რომელიც იცვლის საერთო რესურს counter-ს. მიუტექსი უზრუნველყოფს, რომ მხოლოდ ერთი კუროტინი ერთდროულად აქვს წვდომა ამ სექციაზე, თავიდან აიცილოს შეჯახება. withLock-ის გამოყენება ამარტივებს მიუტექსის მართვას.