Sobes.tech
Middle+

რა არის Semaphore სინქრონიზაციის primitive?

sobes.tech AI

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

Semaphore — ეს სინქრონიზაციის primitive, რომელიც მართავს შეზღუდული რესურსების პულზე წვდომას. ის ინახავს გამოთვლას, რომელიც განსაზღვრავს, რამდენი ნაკადი შეუძლია ერთდროულად მიაღწიოს რესურსს.

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

  • WaitOne (ან WaitAsync ასინქრონული კოდისათვის): ამცირებს გამოთვლას, თუ ის მეტია ნულზე. თუ გამოთვლა ნულია, ნაკადი ბლოკდება მანამ, სანამ გამოთვლა დადებითს არ გახდის (სხვა ნაკადი გამოიძახებს Release).
  • Release: ზრდის გამოთვლას და შეუძლია გამოტოვოს მოლოდინში მყოფი ნაკადი.

Semaphore ტიპები:

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

SemaphoreSlim-ის გამოყენების მაგალითი:

// semaphoreSlim შეიძლება გამოყენებულ იქნას ერთდროულად წვდომის შეზღუდვისთვის რესურსზე
// ამ შემთხვევაში, ნებადართულია 2 ნაკადი ერთდროულად
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // ელის სემაფორის გათავისუფლებას
    await semaphoreSlim.WaitAsync();
    try
    {
        // შეზღუდული რესურსის წვდომა
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} წვდომა რესურსზე");
        await Task.Delay(1000); // სამუშაოს სიმულაცია რესურსთან
    }
    finally
    {
        // სემაფორის გათავისუფლება
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} რესურსის გათავისუფლება");
        semaphoreSlim.Release();
    }
}