![]() |
|
|
#1 (permalink) | ||
|
Süper Mod
![]() ![]() ![]() Üyelik tarihi: Kas 2007
Nerden: ewden(:
Mesajlar: 5.997
Konular: 3048
Üye No: 11341
Ruh halim:
Rep Gücü : 482
Rep Puanı : 9142
Rep Seviyesi :
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Thread Nedir ?
Thread basitçe eş zamanlı çalışan görev olarak düşünülebilir. Normal işlemciler aynı anda 2 tane işlem yap[a]maz. Yani aynı anda 2 tane program veya bir program aynı anda 2 tane işlem çalıştıramaz. Bu sorunu çok hızlı bir şekilde işten işe atlayarak çözer. Ancak bu işlem çok hızlı gerçekleştiği için biz farketmeyiz. Niçin kullanılır ? Banka hesaplarını bir düşünelim, veya bir web sitesini. Birden çok kişi aynı anda işlem yapabiliyor buralarda. Bu işlemlerin bir çoğu thread ile yapılmaktadır. Basitçe her gelen işlem bir thread 'e atanırsa hiçbir istek diğerini kesmeden işlemlerin hepsi birlikte yapılmaktadır ( Basit bir yapıyla düşünecek olursak. Eğer daha detaylara inecek olursak bir çok etkileyen ve etkilenen faktörler olabilir). Küçük bir örnek Şimdi ekrana hem “Merhaba Thread” hemde “Hoşgeldin” yazılarını aynı anda yazan küçük bir konsol uygulamasını inceleyelim. Her biri 10'ar defa yazacak ama ikisinin bekleme süresi farklı birisi 0.5 saniye diğeri 1 saniye. class Program { static void Main(string[] args) { Program p = new Program(); Thread th1 = new Thread(new ThreadStart(p.MerhabaThreadYaz)); Thread th2 = new Thread(new ThreadStart(p.HosgeldinYaz)); th1.Start(); th2.Start(); Console.ReadKey(); } public void MerhabaThreadYaz() { for (int i = 0; i < 10; i++) { Console.WriteLine("Merhaba Thread"); Thread.Sleep(1000);//bir saniye bekle } } public void HosgeldinYaz() { for (int i = 0; i < 10; i++) { Console.WriteLine("Hoşgeldin"); Thread.Sleep(500);//yarım saniye bekle } } } Çıktı Şu şekilde olacaktır. Mesajların geliş sıralarına dikkat edin. ![]() Keywords lock Bir objeyi kilitlemeye yarar. Mesela bir banka programı düşünelim (belki biraz klasik oldu ama). Banka hesabımızın 2 adet kartı olsun. Ben bir bankamatikten arkadaşım başka bir bankamatikten aynı anda para çekmeye çalışıyoruz. Her bir işlem ayrı bir thread olacaktır. Bu mantıkla düşünecek olursak, ben kartı taktım ve hesabımdaki 100 lirayı gördüm, arkadaşımda aynı şekilde gördü. Teorimiz kodun şu şekilde çalıştığı 1. Para miktarını al. 2. Yeterli para varmı kontrol et. 3. Yeterli para varsa parayı ver 4. Çekilen parayı hesaptan düş. Çok basit adımlar olarak görünüyor. Ama Önce ben 100 lira çekmek için tuşa bastım, hemen arkamdan arkadaş bastı. İşlem iç içe çalışacağı için adımları şu şekilde göstermemiz uygun olur. Benim işlemim, Arkadaşımın işlemi 1. Para miktarını al. 2. Para miktarını al. 3. Yeterli para varmı kontrol et. 4. Yeterli para varmı kontrol et. 5. Parayı ver 6. Parayı ver 7. Çekilen parayı hesaptan düş. 8. Çekilen parayı hesaptan düş. Olay çok basit gibi görünüyor. Ama 5. ve 6. satıra dikkat ederseniz bundan sonra her iki işleme de onay verildiğini göreceksiniz. Ve sonuçta hesap negatif duruma düşecektir. Bunu engellemenin değişik yolları olabilir. Ama bizim konumuz thread olduğu için thread gözüyle bakacağız olaya. Eğer elimizde bir seçenek olsa bu para çekme esnasında hesabı kilitleyebilsek ne güzel olur değilmi ? İşte burada lock deyimi imdadımıza yetişiyor. lock ile hesap objesini hafızada kilitlediğimiz zaman lock mekanizmasının yapısından dolayı işi bitene kadar diğer thread bu objeye ulaşamayacağı için bu işlemi sağlıklı bir şekilde yerine getirebiliriz. lock (Hesap) { ParaCek(); } Monitors Monitör de lock gibi kullanılan aynı thread içindeki adımları izleyen bir mekanizmadır. Yukarıdaki örnek aynı mantıkla monitör ile yazılacak olursa: System.Object obj = (System.Object)Hesap; System.Threading.Monitor.Enter(obj); try { ParaCek(); } finally { System.Threading.Monitor.Exit(obj); } Monitörlerin kullanımı biraz daha zordur. Çünkü lock ile karşılaştırıldığında monitörü kendiniz bırakmak zorundasınız fakat lock blok dışına çıktığı zaman otomatik serbest kalmaktadır. Yani kötü yazılmış bir kodda monitör kullanımında bir obje ömrünün sonuna kadar kilitli kalabilir. Mutex Mutex monitör'e benzerdir. Farkı ise farklı process 'ler arasında thread senkronizasyonu yapabilmesidir. Her thread'in sadece 1 tane mutex'i olabilir. Örnek olarak bir uygulamayı sadece 1 defa çalıştırma kodu yazalım namespace birTaneCalis { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { bool calisiyormu; Mutex mt = new Mutex(true, "birtanecalis", out calisiyormu); if (!calisiyormu) { MessageBox.Show("Zaten bir kopya çalışıyor"); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(fals e); Application.Run(new Form1()); } } } Yukarıdaki kodda calisiyormu isimli değişkene ilk defa oluşturulup oluşturulmadığı atılıyor. Eğer değer false ise hafızada 1 tane kopya var demektir, uygulamayı kapatmamız gerekir. Interlocked C# thread'lerle ilgili ilginç bir sınıf daha barındırıyor. Düşünmüşler ki bu lock sisteminin en çok kullanım yerlerinden birisi bir sayıyı artırmak veya azaltmak. Bunun için bir class hazırlamışlar. İsmi Interlocked. Kısa bir kullanım örneği ile bunun da üzerinden geçelim. public int sayac = 0; Interlocked.Increment(ref sayac); Peki hayat bu kadar tozpembe mi ? Thread kullanışlı birşeydir ama ne yaptığınızı biliyorsanız. Fakat tam olarak bilmiyorsanız başınızı çok ağrıtabilecek bir konudur. Thread çalıştırabilmek için sistem kaynak tüketir. Kontrolsüz bir alanda 100.000 adet thread olştuğunu varsayarsak bunu sonucu ne olacak ? Ben merak ettim deneyeceğim. Kod static void Main(string[] args) { for (int i = 0; i < 100000; i++) { Thread th1 = new Thread(new ThreadStart(MerhabaThreadYaz)); th1.Start(); } } public static void MerhabaThreadYaz() { Console.WriteLine("Merhaba Thread"); Thread.Sleep(500);//yarım saniye bekle } Aşağıda da sonuç ![]() Yarım saniyelik bekleme sebebimiz thread'in bir iş yaptığını varsaydık. Programımız 1.1GB ram kullandı. Bu daha programın yarıda kesilmiş hali.bu kadar thread'i kim oluştururki?bu kadarını belki bilinçli olarak kullanmayabilirsiniz. Ama yanlış yazılmış bir thread buna sebep olabilir. Veya kontrolsüz açılan thread'ler.
__________________
BeLqide bu dünya başqa bir gezegenin cehennemidir..!!? SEN GİDİNCE YALNIZ KALACAĞIM.YALNIZLIKTAN KORKMUYORUM DA YA CANIM ELLERİNİ TUTMAK İSTERSE.. ![]() ![]() SiLemıyosaN KaRaLayacaksıN...GideRkeN Kaç Kere BaktıN ArkaNa? ![]() !..... Wayyy Beee!!! İçimizdeki Çocuk Da Gayrı Meşru Çıktı .....!
Mrs. Wampir€ |
||
|
|
|
![]() |
| Bu konunun kısa yolunu aşağıdaki sitelere ekleyebilirsiniz! |
| Konu Araçları | |
| Stil | |
|
|
Benzer Konular
|
||||
| Konu | Konuyu Başlatan | Forum | Cevaplar | son Mesaj |
| thread olayının kullanışı | *MeLeK* | Delphi | 0 | 28-01-2008 13:28 |