Thread Nasıl Kullanılır?

mutex

Herhangi bir programlama diline indirgemeden thread nasıl kullanılır, mantığı nasıldır, mutex nedir ve dikkat edilmesi gereken noktalar nelerdir?

Öncelikle thread(işlem parçacığı) ile process(işlem)’in aynı şey olmadığı net bir biçimde anlaşılmalı. Processler, threadleri kapsar yani bir process içinde birden çok thread olabilir.
Process’ler de thread’ler gibi paralel olarak çalıştırılabilir. Bu yöntemi kullanan uygulamalara ise multiprocess uygulamalar deniliyor. Multiprocess genel olarak aynı anda farklı iki programın paralel çalışması, multithread ise bir program içinde aynı anda çalışan o programa ait ufak iş parçalarının paralel çalışması olarak tanımlanıyor.
Şimdi ise kaynak kullanımı açısından thread ve process arasındaki farklara bakalım. Biraz önce bahsettiğim gibi process’ler thread’leri kapsıyor. Yani örnek verecek olursak 100 tane thread bir tek process içinde çalışabilir, yönetilebilir ve birbirleriyle iletişimleri kolay bir şekilde sağlanabilir. Fakat bu durum büyüyen kodlarda kaynak sıkıntısı doğuracaktır. Buna çözüm olarak her bir thread için bir process oluşturulabilir. Bu sayede threadler kaynakları rahatça kullanabilirler. Ancak bu sefer de birbirleri ile iletişime geçmek istediklerinde zorlanırlar.  Dolayısıyla bu iki yöntem karma bir şekilde kullanmak en iyisidir. Aşağıdaki görseller sayesinde aralarındaki farkı daha iyi görebilirsiniz.
multiprocess gösterimi

multiprocess gösterimi

multithread gösterimi

multithread gösterimi

 

Şimdi  gelelim thread kullanımına. Bir thread’i başlatmadan önce o thread’i bitirmek için neyin beklendiğini veya kendi kendine çalışacak şekilde mi bırakılacağı, kesin biçimde belirlenmelidir. Bu seçenekler elbette programlama diline göre farklılık gösteriyor ama genel olarak hepsinin yapısı birbirine yakın. Hatta bazı programlama dillerinde bunu seçemiyorsunuz, o sizin yerinize her şeyi yapıyor(tabi bundan ne kadar memnunsunuz o ayrı). Eğer yaratılan thread’in yıkıcı fonksiyonu çalışmadan önce bu karar yapılmadıysa, programınız illaki bir yerde sonlanacağı için program tarafından thread’iniz bir şekilde sonlandırılır. Bundan dolayı thread’inize, bağlantısının kesilmesini(detach) yada thread’in işini bitirmesini beklediğinizi(join) kesinlikle belirtmelisiniz.

Thread’i detach etmek, o işin arkaplanda çalışmasını sağlar ve o iş ile direk iletişimi koparır. Detach edilmiş thread’ler genellikle hayalet thread olarak anılırlar çünkü bunlar kullanıcı arayüzünde hiç ortaya çıkmadan sadece arka planda çalışırlar. Bu tip thread’ler uzun süreli thread’lerdir, birçoğu uygulama çalıştığı sürece çalışır ve dosyaların izlenmesi gibi arkaplan işlerini gerçekleştirir.
Peki ya iki farklı thread tam olarak aynı anda, aynı değişkene yada daha genel ifadesiyle aynı bellek alanına erişmeye çalışırsa ne olacak?  Buna thread’lerin çakışması(collision) deniliyor. Bu durumu önlemek önemlidir, mesela bir thread x değişkenine erişti ve 3 saniye boyunca onun değerini kullanacak, tam işini yaparken 2. saniyede başka bir thread geldi ve x değişkeninin değerini değiştirdi. Bu durum çok büyük sorunlara yol açabilir. Bundan dolayı bu durumu önlemek için mutex(mutual exclusion) geliştirilmiştir. Mutex algoritmaları çoklu thread’lerin, eş zamanlı olarak, paylaşılan kaynaklara erişimini önler. Ayrıca bu engellemeler thread’ler arasında senkronizasyonu sağlar. Bir thread gerekli olduğu zaman mutex’i kilitlemeli, işi bittiğinde de bu kilidi kaldırmalıdır.
Bu kadar bilgiden sonra bunu uygulamak artık yazılımcıya ve programlama dilinin kabiliyetlerine kalıyor. Ayrıca bu bilgilere ek olarak 3. sınıf dersim olan Nesneye Yönelik Programlama dersinde bu konu ile ilgili sunum yapmıştım. Derste C++ kullandığımız için sunum da bu doğrultuda ilerliyor. Sunuma aşağıdan erişebilirsiniz.

 

 

 

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir