Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Thread Safe – ConcurrentQueue, ConcurrentDictionary, ConcurrentBag, ConcurrentStack ve BlockingCollection Koleksiyonları ve Kullanım Durumları

Merhaba,

Yazılımsal problemlere çözüm olarak geliştirdiğimiz algoritmalar ihtiyaca dönük olarak yer yer asenkron işlevde geliştirilebilmektedirler. Asenkron süreçler, senkron gidişata nazaran process önceliğini tahmin edilemeyecek bir şekilde değiştirebilecek bir doğaya sahiptirler. Haliyle bu tahmin edilememezlik süreç esnasında olası birçok hatayla bizleri karşı karşıya bırakabilme ihtimaline sahiptirler. Dolayısıyla bizler asenkron işlemlerin ve olası hataların söz konusu olduğu bu belli başlı durumlarda temelinde locking semantiklerini benimsemiş sınıfları barındıran Thread Safe koleksiyonlarını kullanarak muhtelif önlemler almaktayız.

Herşeyden önce Thread Safe Nedir? sorusuna daha derin bir cevap vererek konuya başlayalım;
Thread Safe, anlam olarak iş parçacığı güvenliği şeklinde Türkçe ifade edebileceğimiz bir kavramdır. Thread Safe; birden çok thread’in tekbir kaynağı aynı anda kullanabilmesi/erişebilmesi durumlarında ortaya çıkabilecek tutarsızlıklar neticesinde üretilecek olası hatalara karşı o anki thread’in kaynağını güvenceye alan ve bunu o kaynağı kullanan tüm threadler için sağlayan bir konsepttir.

Yani anlayacağınız elimizdeki bir kaynağı aynı zamanda bir thread okurken bir başka thread kaynaktaki veriler üzerinde değişiklik yaparsa (yahut biri yazar bir diğeri silerse vs.) işte bu tarz asenkron durumlarda hatalar söz konusu olacaktır. İşte bu hataları engellemek ve birden fazla threadin kullandığı kaynak üzerinde oluşan değişiklikleri sadece o anda o değişikliği yapan threadin yaptığını düşündürmek için Thread Safe ile gerekli önlemler sağlanmaktadır.

Thread Safe konseptinin daha da iyi anlaşılabilmesi için “erkekler tuvaletini” düşünebilirsiniz 🙂 Nasıl ki, tuvaletteki pisuvarı o an kullanan kişi işini bitirmeden bir diğeri işine başlamıyor hah işte buradaki rajonun vermiş olduğu ahlak yazılımda Thread Safe sayesinde gerçekleştirilmektedir 🙂 Sanırım bu örnekle daha anlaşılır olmuş olsa gerek…

Bu olası hataları manüpüle edebilmek, asenkron algoritmalarımızda verisel karışıklıklarla maliyete sebep olmamak ve verimsel kesintiye uğratmamak için .NET çatısında Thread Safe koleksiyonları kullanılmaktadır. Bu koleksiyonlar System.Collections.Concurrent namespace’i altında bulunmaktadır ve ConcurrentQueue, ConcurrentDictionary, ConcurrentBag, ConcurrentStack ve BlockingCollection olmak üzere beş tanedir.

Bu koleksiyonların ortak özelliği IProducerConsumerCollection<T> arayüzünü uygulamalarıdır. Dikkat ederseniz üretici/tüketici koleksiyonları ifade eden IProducerConsumerCollection arayüzü ilgili koleksiyona yeni bir eleman eklemek(üretmek) yahut eklenmiş bir elemanı koleksiyondan çıkarmak(tüketmek) durumlarında kullanılır.

Şimdi gelin bu koleksiyonları sırasıyla inceleyelim;

Netice olarak son bir değerlendirmeye mazhar olmamız gerekirse eğer incelediğimiz bu Thread Safe koleksiyonları performans açısından normal koleksiyonlara nazaran oldukça düşük seviyede çalışmakta ve maliyeti arttırmaktadırlar. Bu koleksiyonları asenkron operasyonlar dahilinde yukarıda değindiğimiz senaryolara uygun bir şekilde değerlendirmenizi ve yersiz bir şekilde kullanımından kaçınmanızı önemle vurguluyorum.

Thread Safe – Eşzamanlı Koleksiyonların performans ölçüsü

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Mobil sürümden çık