Threading Temelleri¶
Genel Bakış¶
Threading, bir uygulamanın aynı anda birden fazla işi paralel olarak yürütmesini sağlayan bir programlama tekniğidir. C#'ta System.Threading namespace'i altında bulunan sınıflar kullanılarak thread işlemleri yapılır.
Thread Oluşturma ve Yönetimi¶
-
Thread Oluşturma
// Thread oluşturma ve başlatma Thread thread = new Thread(() => { Console.WriteLine("Thread çalışıyor"); }); thread.Start(); // Thread parametreli metod Thread thread2 = new Thread((object param) => { Console.WriteLine($"Parametre: {param}"); }); thread2.Start("Merhaba");
-
Thread Özellikleri
Thread thread = new Thread(() => { }); // Thread önceliği thread.Priority = ThreadPriority.Highest; // Thread durumu bool isAlive = thread.IsAlive; // Thread adı thread.Name = "WorkerThread";
-
Thread Bekletme
// Thread'i belirli süre bekletme Thread.Sleep(1000); // 1 saniye // Thread'i sonsuza kadar bekletme thread.Join();
Thread Senkronizasyonu¶
-
lock Kullanımı
private object _lock = new object(); private int _counter = 0; public void IncrementCounter() { lock (_lock) { _counter++; } }
-
Monitor Kullanımı
private object _monitor = new object(); public void CriticalSection() { Monitor.Enter(_monitor); try { // Kritik kod } finally { Monitor.Exit(_monitor); } }
-
Mutex Kullanımı
private Mutex _mutex = new Mutex(); public void ProtectedMethod() { _mutex.WaitOne(); try { // Korunan kod } finally { _mutex.ReleaseMutex(); } }
Thread Pool Kullanımı¶
-
ThreadPool ile İş Yürütme
ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine("ThreadPool thread'i çalışıyor"); });
-
ThreadPool Özellikleri
// Minimum thread sayısı ThreadPool.SetMinThreads(4, 4); // Maximum thread sayısı ThreadPool.SetMaxThreads(16, 16); // Mevcut thread sayısı ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
Thread Güvenliği¶
-
Thread-Safe Koleksiyonlar
// Concurrent koleksiyonlar ConcurrentQueue<int> queue = new ConcurrentQueue<int>(); ConcurrentStack<int> stack = new ConcurrentStack<int>(); ConcurrentDictionary<string, int> dictionary = new ConcurrentDictionary<string, int>();
-
Volatile Değişkenler
private volatile bool _isRunning = true; public void Stop() { _isRunning = false; }
-
ThreadLocal Değişkenler
private ThreadLocal<int> _threadLocal = new ThreadLocal<int>(() => 0); public void UseThreadLocal() { _threadLocal.Value = 42; }
Thread İletişimi¶
-
AutoResetEvent Kullanımı
private AutoResetEvent _event = new AutoResetEvent(false); public void SignalThread() { _event.Set(); } public void WaitForSignal() { _event.WaitOne(); }
-
ManualResetEvent Kullanımı
private ManualResetEvent _event = new ManualResetEvent(false); public void SignalAllThreads() { _event.Set(); } public void ResetSignal() { _event.Reset(); }
Thread İptali¶
- CancellationToken Kullanımı
private CancellationTokenSource _cts = new CancellationTokenSource(); public void StartOperation() { Task.Run(() => { while (!_cts.Token.IsCancellationRequested) { // İşlem } }, _cts.Token); } public void CancelOperation() { _cts.Cancel(); }
Mülakat Soruları¶
- Thread Temelleri
- Thread nedir ve ne işe yarar?
- Process ve Thread arasındaki farklar nelerdir?
-
Thread oluşturmanın maliyeti nedir?
-
Thread Senkronizasyonu
- Race condition nedir ve nasıl önlenir?
- Deadlock nedir ve nasıl önlenir?
-
lock, Monitor ve Mutex arasındaki farklar nelerdir?
-
Thread Pool
- ThreadPool nedir ve ne zaman kullanılır?
- ThreadPool'un avantajları ve dezavantajları nelerdir?
-
ThreadPool thread'leri nasıl yönetilir?
-
Thread Güvenliği
- Thread-safe kod nedir?
- Volatile anahtar kelimesi ne işe yarar?
-
ThreadLocal nedir ve ne zaman kullanılır?
-
Thread İletişimi
- Thread'ler arası iletişim nasıl sağlanır?
- AutoResetEvent ve ManualResetEvent arasındaki farklar nelerdir?
-
Thread'ler arası veri paylaşımı nasıl yapılır?
-
Thread İptali
- Thread iptali nasıl yapılır?
- CancellationToken nasıl kullanılır?
-
Thread iptalinde dikkat edilmesi gerekenler nelerdir?
-
Performans
- Thread sayısı nasıl belirlenir?
- Thread'lerde performans optimizasyonu nasıl yapılır?
-
Thread context switching nedir?
-
Hata Yönetimi
- Thread'lerde exception handling nasıl yapılır?
- Unhandled exception'lar nasıl yakalanır?
-
Thread'lerde hata raporlama nasıl yapılır?
-
Resource Yönetimi
- Thread'lerde resource leak nasıl önlenir?
- Thread'lerde memory kullanımı nasıl yönetilir?
-
Thread'lerde file handle'ları nasıl yönetilir?
-
Best Practices
- Thread kullanımında best practices nelerdir?
- Thread senkronizasyonunda dikkat edilmesi gerekenler nelerdir?
- Thread güvenliği nasıl sağlanır?
Örnek Kod Soruları¶
-
Thread-Safe Counter
public class ThreadSafeCounter { private int _count = 0; public void Increment() { // Implementasyon } public int GetCount() { // Implementasyon } }
-
Producer-Consumer Pattern
public class ProducerConsumer { private Queue<int> _queue = new Queue<int>(); public void Start() { // Implementasyon } }
-
Thread Pool Manager
public class ThreadPoolManager { public void ExecuteTask(Action task) { // Implementasyon } }
-
Thread İptal Mekanizması
public class CancellableOperation { public void Start(CancellationToken token) { // Implementasyon } }
-
Thread Senkronizasyonu
public class SynchronizedResource { private object _resource; public void AccessResource() { // Implementasyon } }