Sobes.tech
Middle+

როგორ მუშაობს mutex კორუტინებში?

sobes.tech AI

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

მიუტექსი (Mutex) კუროტინებში უზრუნველყოფს ურთიერთგამორიცხვის მექანიზმს საერთო რესურსების დაცვისთვის ერთდროულად რამდენიმე კუროტინის მიერ წვდომისგან.

მუშაობის პრინციპი:

  1. მიუტექსის დაკავება: კუროტინი, რომელიც სურს მიიღოს წვდომა დაცულ რესურსზე, იძახის მეთოდს lock().
  2. ბლოკირება: თუ მიუტექსი თავისუფალია, კუროტინი ბლოკირებამდე არ ბლოკავს და აგრძელებს მუშაობას. თუ მიუტექსი დაკავებულია სხვა კუროტინის მიერ, იძახის კუროტინი შეჩერდება მანამდე, სანამ მიუტექსი არ გათავისუფლდება.
  3. მიუტექსის გათავისუფლება: სამუშაო დასრულების შემდეგ, კუროტინი იძახის მეთოდს 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-ის გამოყენება ამარტივებს მიუტექსის მართვას.