Thread Kavramı

Ebru Demiryürek —  8 Eylül 2014 — 6 Comments

Thread (iplik) kavramı, aynı process ortamında birden fazla iş yürütme imkanı sağlar. Bir process’in çalışmaya başlaması ile birlikte bir thread (main thread) oluşturulur ve bu process içerisinde birden fazla iplik (multi-thread ) oluşturulabilir. Yaratılan iplikler aynı adres uzayında koşarlar. Her ipliğin kendine has program sayacı, saklayıcıları, yığını ve durumu(yok edilme, askıya alınma, önceliğinin değiştirilmesi) vardır. Bir iplikteki (thread) değişkeni aynı işlem tarafından üretilmiş bütün iplikler değiştirebilir veya okuyabilir.

a

Şekil 1: Process ve iplik modelinin görünümü

Threadler iş parçacıkları olup, çoklu görevlerde senkronizasyonu sağlamak için kullanılır. Her threadin farklı bir görevi vardır. Eğer bu threadler aynı anda aynı bölgeye girerse hatalar (deadlock) meydana gelebilir.

thread1

Şekil 2: Threadlerin senkronizasyonla çalışma şekli

Tek thread kullanımında, bilgisayarımızda bir programı çalıştırmak istediğimizde işlem bitene kadar programımızın arayüzü yanıt vermiyor olarak görünecektir. İşlem bitene kadar programımızdaki diğer kodlar çalışmaz. Bu durumların önüne geçebilmek için multithreading kullanılıyor. Multithreading de aynı anda birçok işlem yapabiliriz ve arayüzün yanıt vermemesine neden olmazlar.

Threading geliştirme teknolojisiyle genellikle arka planda sürekli çalışmasını istediğimiz bir program parçacığı varsa kullanırız. Örneğin; bir antivirüs yazılımının gerçek zamanlı koruma yapabilmesi için thread teknolojisini kullanması gerekir.
Thread kullanımı avantajlı bir kullanım gibi gözükse de yerinde ve etkili bir biçimde kullanılmayacak olursa, thread bizim program hızımızı arttırmak yerine programımızı yavaşlatır. Örneğin; 5 iplik bir işi 0.001 saniyede yapıyorsa 5000 iplik bin kat daha hızlı yapar gibi bir düşünce çok yanlıştır !!! Çünkü iplikler aynı kaynağı kullanır ve programda çakışma ihtimalleri vardır. Ama ipliklerin bazıları işlemciye yönelik işlemler bazıları da giriş-çıkış birimlerine yönelik işlemler yaparsa performans biraz daha iyi artacaktır. Hepsi işlemciye yönelik işlemler yaparsa performans artışı sağlanmaz.

thread1 (2)

Şekil 3: Threadlerin ortak kaynağı kulladığının gösterimi

Resimde gördüğümüz gibi threadler aynı kodu, veriyi ve dosyaları kullanmasına rağmen farklı register ve stack’leri vardır. Bu sayede aynı kod içinde farklı işler yapıp farklı şeyleri hafızada tutabiliyor. Tek thread kullanımına göre bu yönüyle oldukça avantajlıdır.

thread2

Şekil 4: Threadların kullandıkları kaynak gösterimi

Threading işlemlerini yöneten tipler System.Threading kütüphanesindedir. Thread sınıfının birçok metodu olduğu üzere ben en temel Start() ve Sleep() metoduna değineceğim.

Start() :Thread sınıfının en temel metotudur ve threadlerin çalışmasını başlatır.

//Thread nesnesi oluşturup ThreadStart(çalıştırılacak methodun adı) metoduyla çalıştırılacak olan method belirtilir.

Thread thread1= new Thread(new ThreadStart(function1));

//thread1 çalıştırılır.

thread1.Start();

Sleep(): Sleep metodu kullanarak threadin çalışmasını bir süreliğine bekletebiliriz. Örneğin; belli bir süre a fonksiyonu çalıştırıp 0.05(örneğin) saniye dinlendirdikten sonra işleme devam edebiliriz ya da o sırada başka fonksiyonları çalıştırabiliriz.

Thread.Sleep();

Basit bir örnekle Start() ve Sleep() metodunun program içerinde nasıl kullanıldığını gösterelim.

“Program.cs “sınıfında threadleri oluşturup istediğim fonksiyonları çalıştırıyorun. “baslat.cs” sınıfına çalıştıracağım fonksiyonları yazıyorum. (Gerekli açıklamalar kod üzerindedir.)

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace multithread
{
class Program
{
static void Main(string[] args)
{

//baslat sınıfı oluşturup içene fonksiyonlarını yazıyoruz.
baslat bs = new baslat();

//ilk threadi oluşturup baslat sınıfının içerisindeki function1methodunu çalıştıracağımızı belirtiyoruz.

Thread function1 = new Thread(new ThreadStart(bs.function1method));

//ikinci threadi oluşturup baslat sınıfının içerisindeki function2methodunu çalıştıracağımızı belirtiyoruz.

Thread function2 = new Thread(new ThreadStart(bs.function2method));

function1.Start(); //start metodu ile fonksiyonlar çalıştırılır.
function2.Start();
Console.ReadKey();
}
}
}

Şekil 5: Threadlerin start metodu ile çalıştırılması

baslat.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace multithread
{
class baslat
{
public void function1method()
{
for (int i = 0; i < 5; i++)
Console.WriteLine("function1 çalıştı" + i);
}
public void function2method()
{
for (int i = 0; i < 5; i++)
Console.WriteLine("function2 çalıştı" + i);
}
}
}

Şekil 6:Threadler ile çalıştıracağımız fonksiyonlar

Program çıktısında da gördüğünüz gibi threadler birbirini beklemez karışık olarak çalışır. Ama sırayla çalıştığını görmenizde mümkündür.

cikti12

Şekil 7 : Program çıktısı

baslat.cs (sleep() metodu eklenmiş hali)

using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace multithread
{
class baslat
{
public void function1method()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("function1 çalıştı" + i);
Thread.Sleep(100); //thread bekletilir.
}
}
public void function2method()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("function2 çalıştı" + i);
Thread.Sleep(100);// thread bekletilir.
}
}
}
}

Şekil 8: Sleep metodunun kullanım şekli

Programımıza sleep() metodu ekledikten sonra her iki fonksiyonu da eşit süre uyutursak sırayla çalıştığını görebiliriz.

cikti2

Şekil 9: Sleep metodu kullanıldığında program çıktısı

Benim threadler ile anlatacaklarım bu kadar. Umarım faydalı olmuştur 🙂 .

Kaynaklar

http://www.yazilimdevi.com/Makaleler-574-cSharp-ta-thread-kullanimi.aspx

http://newsbilisim.blogcu.com/c-da-thread-kavrami/4644498

http://bilgisayarkavramlari.sadievrenseker.com/2010/03/22/thread-iplik/

http://www.csharpnedir.com/articles/read/?id=742

http://blog.fatihbakir.net/tag/c-thread-ornek/

http://burakisikli.wordpress.com/2009/06/16/multi-threadedcok-kanalli-programlama/

Ebru Demiryürek

Posts

6 responses to Thread Kavramı

  1. ellerinize sağlık gayet açıklayıcı olmuş

  2. Oğuzhan Şahin 1 Nisan 2016 at 17:56

    Güzel çalışma , teşekkürler.

  3. Ebru Hanım bu konuda Türkçe kaynakların arasında bence en iyisi sizinki. Emeğinize sağlık…

Tuğba Üstündağ için bir cevap yazın Cevabı iptal et