Sobes.tech
Middle+

Kas yra Semaphore sinchronizacijos primityvas?

sobes.tech AI

Atsakymas iš AI

Semaphore — tai sinchronizacijos primitivas, kuris valdo prieigą prie riboto išteklių baseino. Jis palaiko skaitiklį, kuris nustato, kiek srautų gali vienu metu pasiekti išteklių.

Pagrindinės operacijos:

  • WaitOne (arba WaitAsync asinchroniniam kodui): sumažina skaitiklį, jei jis didesnis už nulį. Jei skaitiklis lygus nuliui, srautas yra blokuojamas iki tol, kol skaitiklis taps teigiamas (kitas srautas iškvies Release).
  • Release: padidina skaitiklį ir gali atrakinti laukiančią srautą.

Semaphore tipai:

  • Semaphore: sistemos lygio (su ar be vardo), gali būti naudojamas tarp procesų.
  • SemaphoreSlim: lengvas įgyvendinimas, skirtas naudoti viduje proceso. Pirmenybė teikiama intra-proceso sinchronizacijai.

SemaphoreSlim naudojimo pavyzdys:

// semaphoreSlim gali būti naudojamas riboti vienu metu prieigą prie išteklių
// Šiuo atveju leidžiama 2 srautams vienu metu
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Laukia semaforo išlaisvinimo
    await semaphoreSlim.WaitAsync();
    try
    {
        // Prieiga prie riboto išteklių
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} prieina prie išteklių");
        await Task.Delay(1000); // Darbo su ištekliais simuliacija
    }
    finally
    {
        // Išlaisvina semaforą
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} išlaisvina išteklius");
        semaphoreSlim.Release();
    }
}