Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Ortak değişkene thread'ler arası erişim

Konu, 'Yazılım Geliştirme' kısmında roser137 tarafından paylaşıldı.

  1. roser137

    roser137 Daimi Üye

    Kayıt:
    27 Aralık 2008
    Mesajlar:
    697
    Beğenilen Mesajlar:
    3
    Merhaba arkadaşlar.

    Thread'ler arası veri paylaşımı ile anlamadığım bir nokta var. Diyelim ki internet üzerinden çalışacak bir sözlük uygulaması geliştiriyoruz. Aynı anda binlerce istek olabilir. Kelimeleri ve çevirileri global bir değişkende tutuyoruz. Dictinary, Map, HashTable gibi bir yapı örneğin:

    sozluk = { "kelime1": "ceviri", "kelime2": "çeviri2", ... }

    böyle devam etsin. Diyelim ki milyonlarca kelime var.

    Bir de arama fonksiyonumuz olsun ve çok kelime olduğu için ortalama çalışma süresi 100ms olsun. Sözlükte arama yapıp sonucu bize versin.

    Eğer global sozluk değişkenimiz sabitse aynı anda binlerce istek bile olsa, anladığım kadarıyla arama fonksiyonunu thread ile kullanabiliriz. Yani anlık 100 arama isteği için 100 thread başlatırsak bunlar paralel bir şekilde sorunsuzca çalışıyor, bizi kısıtlayan bir nokta yok.

    Sözlüğe yazma işlemi yapmak istersek işler karışıyor. Diyelim ki kelime sileceğiz, bu esnada okuma yapılmasına izin veremeyiz çünkü döngüye aldığımız sözlük değişkenin eleman sayısı değişiyor, hatta komple yapısı değişiyor. Mecburen lock kullanmamız gerekiyor. Yani sözlüğe yazarken okuma yapılmaması gerekiyor.

    Sorun şu ki lock'u hem okuma hem yazma fonksiyonunda kullanmamız lazım. Böyle olunca global değişkenimiz %100 thread-safe oluyor. Ama artık okuma da da lock kullandığımız için aynı anda yalnızca tek threadden okuma yapabiliyoruz. Bu da tüm esnekliği, performansı bitiriyor.

    Şöyle bir çözüm yok mu, yalnızca yazma işlemi esnasında tüm threadler engellensin, ama yazma değil okuma yapıyorsak aynı anda sınırsız sayıda thread global sözlük değişkenine erişim sağlayabilsin. Sözlük örneğini özellikle verdim çünkü yeni kelime ekleme silme işlemi çok nadir yapılacak bir işlem ama okuma işlemi sürekli yapılacak. Dolayısıyla okuma esnasında lock, mutex kullanmak istemiyorum.

    Thread senkorizasyonu tekniklerine biraz baktım mutex, semaphore gibi yöntemler erişimi kısıtlıyor ama okuma yazma ayrımı yapmıyor. Rust dilinde bu iş için özel yapılar var. Tam olarak dediğime izin veriyor. Değişkeni aynı anda sınırsız okuma ya da yalnız tek thread için yazma olarak kullanabiliyorsunuz. Yani yapılabilen bir şey ama diğer dillerde nasıl yapabiliriz, bu işin mantığı nedir ?
     
  2. seyfi73

    seyfi73 Yeni Üye

    Kayıt:
    7 Haziran 2017
    Mesajlar:
    16
    Beğenilen Mesajlar:
    1
    Şehir:
    Evren
    .
     
    Son düzenleme: 10 Temmuz 2017
    Furkan Onka Uğur bunu beğendi.