Kabaca thread’ler bir programın paralel ve birbirinden bağımsız işlemler yapmasını sağladığını söyleyebiliriz.
Thread çeşitleri
İki tip thread vardır:
· Kullanıcı tarafından oluşturulan thread’ler. – Bir programda oluşturulan thread’ler program için ayrılan adres alanını kullanır, yani onun için işlemci tarafından ayrı bir adres alanı ayrılmaz.
· İşlemci tarafından oluşturulan thread’ler.
· Kullanıcı tarafından oluşturulan thread’ler. – Bir programda oluşturulan thread’ler program için ayrılan adres alanını kullanır, yani onun için işlemci tarafından ayrı bir adres alanı ayrılmaz.
· İşlemci tarafından oluşturulan thread’ler.
Multithreading vs Single Threading
· Single threading - İşlemcinin thread kavramını desteklemediği durumlar; programımızda thread kullandığımızı anlamaz.
· Multithreading - İşlemcinin aynı process içinde farklı thread’lerin kullanımını desteklediği durumdur.
· Single threading - İşlemcinin thread kavramını desteklemediği durumlar; programımızda thread kullandığımızı anlamaz.
· Multithreading - İşlemcinin aynı process içinde farklı thread’lerin kullanımını desteklediği durumdur.

· MS-DOS - support a single user process and a single thread
· UNIX - supports multiple user processes but only supports one thread per process
· Solaris - supports multiple threads
· UNIX - supports multiple user processes but only supports one thread per process
· Solaris - supports multiple threads
Yukardaki şekilde iki kavramın belleği nasıl kullandıkları gösterilmiştir. Görüldüğü üzere multittreading’te User Address Space tektir, yani o process tarafından oluşturulan tüm thread’ler aynı alanı paylaşırlar. 
Thread’lerin çakışması nasıl önlenir?
Bu mutex sayesinde olur. Mutex, Process Control Block’un içinde bulunan bir çeşit global değişkendir; açılımı mutual exclusion dur ve deadlock (işlemler düğümünü) önlemek için threadlerin kullandığı bir değişkendir. Bir thread CPU, I/O vb. gibi bir yerde işlem yapacağı zaman mutex değişkenine değer atarak o alanı kullanıldığını ifade eder. Bu sırada başka bir thread tarafından o alanda işlem yapılacaksa mutexin sıfırlanmasını bekler ve daha sonra kendisi mutex’e değer atarak işlemini gerçekleştirir.
Örnek
Diyelim ki kullanıcının klavyeden herhangi bir input girmesini bekleyen bir program yazmak istiyouz, o zaman “Console.WriteLine("Bir input giriniz…");” yazarız ve programımız kullanıcı herhangi bir input girene kadar bekleyecektir.
Fakat, diyelim ki bu bir chat programı ve aynı zamanda soketleri de dinleyerek gelen veri olup olmadığını kontrol etmek istiyoruz. Eğer sadece soketleri dinleyen program yazarsak program çalıştığınıda soketlerde veri görene kadar bekleyecektir ve bu zaman içerisinde başka bir işlem yapamayacaktır.
Bir chat programını ancak thread mantığı ile yapabiliriz: İki tane thread metodu oluştururuz, bir tanesi soketi dinleyen metod olur, diğeri ise kullanıcıdan input bekleyen metod olacaktır. Daha sonra iki tane thread oluştururuz; thread’i oluşturma sırasında birine ekrandan input alan metodun adını yazarak ilkleriz, diğerine de soket metodunu çalıştır deriz:
Diyelim ki kullanıcının klavyeden herhangi bir input girmesini bekleyen bir program yazmak istiyouz, o zaman “Console.WriteLine("Bir input giriniz…");” yazarız ve programımız kullanıcı herhangi bir input girene kadar bekleyecektir.
Fakat, diyelim ki bu bir chat programı ve aynı zamanda soketleri de dinleyerek gelen veri olup olmadığını kontrol etmek istiyoruz. Eğer sadece soketleri dinleyen program yazarsak program çalıştığınıda soketlerde veri görene kadar bekleyecektir ve bu zaman içerisinde başka bir işlem yapamayacaktır.
Bir chat programını ancak thread mantığı ile yapabiliriz: İki tane thread metodu oluştururuz, bir tanesi soketi dinleyen metod olur, diğeri ise kullanıcıdan input bekleyen metod olacaktır. Daha sonra iki tane thread oluştururuz; thread’i oluşturma sırasında birine ekrandan input alan metodun adını yazarak ilkleriz, diğerine de soket metodunu çalıştır deriz:
Thread workerThread = new Thread(ScreenInput);
Thread workerThread2 = new Thread(SocketData);
Herhangi biri tetiklendiğinde (örneğin ekrandan input girişi yapıldı veya soketten veri yakalandı) o zamano işi yapan thread işini bitirene kadar çalışır ve tekrar arka plana geri dönerek beklemeye devam eder.
Kod örneği
Aşağıda bulunan örnekte bir thread oluşturuluyor ve çalışmaya başladığında ekrana “worker thread: working...” yazısını yazdıran metodu çalıştırıyoruz. Thread’i 1 saniye bekleterek metodu durduruyoruz ve metodun sonlandığını yazdırıyoruz ekrana.
Bir thread workerThread.Start()denildiği zaman çalışmaya başlar.
Aşağıda bulunan örnekte bir thread oluşturuluyor ve çalışmaya başladığında ekrana “worker thread: working...” yazısını yazdıran metodu çalıştırıyoruz. Thread’i 1 saniye bekleterek metodu durduruyoruz ve metodun sonlandığını yazdırıyoruz ekrana.
Bir thread workerThread.Start()denildiği zaman çalışmaya başlar.
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Burada thread objesi yaratılmakta. Bu satırlar threadi çalıştırmaz,
// sadece oluşturur.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// Worker thread’i çalıştır.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");
// Eğer worker thread çalışır haldeyken
// yapılmasını istediğimiz birşey varsa
// while (!workerThread.IsAlive){ Console.Writeline(); ... }; yazarız.
// Eğer döngü içinde sleep() kullanarak çalışma süresi vermezsek
// sonsuz döngüye girer.
// main thread’i 1 milisaniye kadar duraklatıp
// bu zaman içerisinde worker thread ekrana yazı basar.
Thread.Sleep(1);
// worker thread’in durdurulması sağlanır
workerObject.RequestStop();
// Join metodunu şu anda çalışan thread’i bloke etmek için kullanılır
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
public class Worker
{
// Bu metod thread başlatıldığında çağırılır
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile derleyiciye bu verinin birkaç thread tarafından
// kullanılacağını söyler
private volatile bool _shouldStop;
}
}
}
Bu programı çalıştırdığımızda böyle bir çıktı elde ederiz:
main thread’e sleep demek yerine başka işlem de yaptırabilirdik ve iki thread de aynı zamanda da arka planda çalışır durumda olacaktı.

0 yorum:
Yorum Gönder