İçeriğe geç

İOS ile Semaphore kullanımı

Merhabalar bu yazımda Bilgisayar bilimlerinde önemli bir yere sahip olan ve paralel işlemlerde yapıya göre aktif bir şekilde kullanılan Semaphore yapısını yazdığımız İOS uygulamalarımızda nasıl kullanırız bunu göstereceğim.

Öncelikle Semaphore nedir ? diye soracak olursanız. Bu yapı işletim sistemlerinde yoğun bir şekilde kullanılmakta olan bir yapıdır. Yapı olarak birden fazla çalışan process yani işin duruma göre bekletilmesi ve diğer process tamamlanınca devreye girmesi gibi işlemlerde görev alır.

Gerçek hayattan örnek vericek olursam Semaphore yapısını trafik lambalarına benzetebiliriz. Yayaları ve araçlarıda iki ayrı process olarak düşünelim. Trafik ışığı kırmızı yandığı zaman akan araç processi durmuş ve yaya processinin yani tekrar yeşil ışık yanmasını beklemektedir. Yeşil yandığı zaman işleme devam etmektedir. Bu işlemleri Semaphore sınıfında sinyal gönder ve bekle işlemleri ile hallederiz.

İOS üzerinde Thread işlemleri gerçekleştirdiğimizde işimize yaramaktadır. Uygulama cihaza veri indirirken farklı işlemlerin müdahale etmesini engellemek vs gibi olaylarda oldukça etkilidir. Veya wait süresini kontrol ederek işlemi zaman aşımına uğratabiliriz.

Aşağıda yazdığım örnekleri inceleyip derleyerek daha iyi bir fikir sahibi olabilirsiniz.

let semaphore = DispatchSemaphore(value: 0)
        
        DispatchQueue.global().async {
            print("wait")
            semaphore.wait() // buradan aşağısı beklemeye girdi sinyal gelene kadar
            print("execute")
        }
        
        DispatchQueue.global().async {
            sleep(2)
            print("calling signal")
            semaphore.signal()
        }

Diğer bir örnekte bahsettiğim zaman aşımı kontrolü için nasıl yazabileceğimizi görebiliriz.

DispatchQueue.global().async {
        
            print("wait")
            let res = semaphore.wait(timeout: DispatchTime.now() + 5) // 5 sn max bekler
            
            if(res == .timedOut){
                print("timed out")
            }else{
                print("signal call")
            }
            
        }
        
        DispatchQueue.global().async {
            sleep(3)
            print("calling signal")
          
            semaphore.signal()
        }

 

 

 

Kategori:iOS

Bu yazı yorumlara kapalı.

Copyright © 2022 Kenan Atmaca