SensiZOlmuyoR.org  
Geri git   SensiZOlmuyoR.org > Pc - Bilgisayar > Programlama > C ve C++
İhbar sistemini kullanmak istermisin?


En iyi Paylaşımınız Ney¿

Cevapla
 
Konu Araçları Stil
Eski 07-02-2008, 22:26   #1 (permalink)
Süper Mod
 
WaMPiR_CaDı - ait Kullanıcı Resmi (Avatar)
 
Ü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 : WaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond reputeWaMPiR_CaDı has a reputation beyond repute


Standart C# ve Thread


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€

WaMPiR_CaDı isimli üyemiz çevrimdışıdır. (Offline)  
Bu Mesajı Google'a Ekle!Bu Mesajı FaceBook'da Paylaş!
Alıntı ile Cevapla
Cevapla

Bu konunun kısa yolunu aşağıdaki sitelere ekleyebilirsiniz!

Konu Araçları
Stil

Yetkileriniz
Konu Açma Yetkiniz Yok
Mesaj Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-KodlarıKapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı

Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar son Mesaj
thread olayının kullanışı *MeLeK* Delphi 0 28-01-2008 13:28


Tüm Saatler GMT +3. Şuan Saat: 16:15 .
(Türkiye için GMT +2 seçilmelidir.)


Powered by vBulletin Version 3.7.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
www.SensiZOlmuyoR.org © 2007 - 2008


Bağış yapın

* Metin2 * Trendy Bayan *Sohbet * Bilgisonsuz