Herkese merhaba bu yazıda thread kullanımdan bahsetmeye çalışacağım. Öncelikle thread nedir? Thread bize ne sağlar, ne işe yarar gibi soruları cevaplamaya çalışacağım.
Thread işletim sistemleri için process’lerin alt parçacıkları (iş parçacığı) olarak düşünebiliriz, yani bir process çalışır ve process’in altında bir ve ya bir den çok thread bu process’e hizmet eder. Thread’ler bize en genel mana da eş zamanlı çalışma fırsatı sağlarlar yani bir işi yaparken başka işler yapmamıza olanak verirler. Aslında bilgisayar eş zamanlı hiç bir işi yapamaz sadece çok hızlı olduğu için biz öyle hissederiz(işleri hep çok hızlı sıra ile yapar). Örnek vermek gerekirse bir uygulamamız var uygulamada form ekranın bir köşesinde internetten hem sürekli veri çekip hem de bunu kullanıcıya bir kenarda reklam olarak göstermek istiyoruz ve tabi aynı zaman da programda yapılacak işler var zaten temel amaç programda işlerimizi yapmak 🙂 bu durumda reklamları sürekli “while” döngüsü ile döndürdüğümüzü düşünelim(sonsuz döngü) eğer program sürekli bu döngü içerisinde kalırsa iş yapmak gibi bir şansımız olur mu? hayır, işte tam burada biz bir thread yazıyoruz ve thread’e diyoruz ki sen sadece internette veri çek ve bir köşede çektiğin reklam verilerini sergile ben işime bakayım ve o thread orada artık kendisi bizden bağımısız bir şekilde çalışıyor. Başka bir thread’e diyoruz ki şirketin ödenecek makbuzlar listesini veritabanından 3 saatte bir çek ve bana göster, bir başkasına diyoruz ki 6 saatte bir bana hava durumunu göster, bir başkasına ödeme günü yaklaşan müşterilere ödemeleri ile ilgil mail at. Sonuç itibariyle bir süre sonra baktığımızda threadler ile aslında zamanlama işlemleri de gerçekletirilebilir bazı tarih saat bilgileri kontrol edilerek bu saydığım işlemleri otomatik halledebilirler. Ama burada verdiğim örneklerin hepsinde her bir thread farklı bir alana erişiyor ve işlemlerini ayrı ayrı alanlarda yapıyor, peki bu threadler ortak bir alana erişmek isterseler ne olur? Thread kullanırken dikkatli olmamız gereken noktalar vardır, misal bir den fazla thread aynı bölgeye ulaşmaya çalışırsalar hatalara, problemlere neden olabilirler. Bu durumu engellemek için, her seferinde o bölgede yalnız bir thread’in iş yapmasına izin vermeye mutex(mutual exculison) denir. Bu tek thread’e tahsis edilen bölgeye kritik bölge denir. Bu durumu sağlamak için ise C# bize bir kaç yöntem sunmaktadır bunlar sıra ile;
- Lock
- Semaphore
- Mutex
- Monitor
Lock en temel thread yönetim şeklidir ortak alananın başına eklenir ve yalnızca tek bir thread’in ulaşımına izin verir ortak.
Semaphore’u aslında diğerlerinden ayıran önemli bir özelliği vardır az önce ortak alana yalnızca tek bir thread girebilir dedik ama semaphore bu kuralı biraz esneterek bizim ayarladığımız kadar thread’in ortak alana erişimine izin verir. Misal ortak alana aynı anda 2 thread için izin verdik ilk önce hangi thread’in çalışacağına işletim sistemi karar verecektir biz bu öncelik sırasına müdahale edemiyoruz.
Mutex yine ortak bölgeye yalnızca tek bir thread’in erişimine izin verir. Kritik bölgenin seçileceği satır başlangıcında mutex başlatılır ve nereye kadar istiyorsak en son o satırda da mutex’i sonlandırırız. Bu durum semaphore için de geçerlidir.
Buraya kadar bahsettiğimiz yöntemlerin hepsi işletim sistemi düzeyinde çalışan yöntemlerdir. Monitor yöntemi ise C#’ın sunduğu kendi yöntemidir. Yani ilk 3 yöntem işletim sistemi düzeyinde çalışırlarken monitor bir yazılımdır işletim sistemi düzeyinde değildir. Kullanımı lock ile benzerlik gösterir yine kritik bölgenin başlangıcı ve sonu işaretlenebilir bu yöntem ile.
Kendi bildiğim kadarı ile thread mantığını anlatmaya çalıştım sonra ki yazıda kodlar ile örnekler vermeye çalışacağım, herkese iyi çalışmalar.