11 Ocak 2016 Pazartesi

C++ Semaphore

Semaphore, lock ve mutex'in aksine senkronize erişimi tamamen bekletmek değil sınırlandırmak için kullanılır. Bu ne demek? Diyelim ki sınırlı bir kaynağımız var, aynı anda 5 thread'in erişimi sistem için sorun olmuyor ama 5'ten fazla thread tarafından o kaynak kullanılmak istendiğinde performans sorunu yaşanıyor ve dolayısıyla kodun o bölümünü bütün thread'lerin erişimine açmak istemiyoruz. Bu durumda sayaçlı bir lock mekanizmasına ihtiyacımız var. İşte o mekanizmanın adı Semaphore.
01// İzin verilen = 5, başlarken kullanılmış = 0
02private Semaphore sem = new Semaphore(0, 5, "YazilimProjesi_Semaphore");
03 
04public void IslemYap()       
05{           
06   sem.WaitOne();           
07   try           
08   {               
09      YogunKaynakKullananIslem();
10   }           
11   finally           
12   {               
13      sem.Release(1); // Sadece bir kilit kaldırılsın
14   }       
15 }
Şunu da belirtelim ki lock ve mutex'i sadece kilitleyen thread/proses kilidi kaldırabiliyorken semaphore üzerindeki kilidi herhangi bir thread/proses kaldırabilir. Ayrıca, semaphore da mutex gibi isim verilerek yaratıldığında prosesler arası senkronizasyon için de kullanılabilmektedir.
Share: