Skip to content

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

  1. 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");
    

  2. Thread Özellikleri

    Thread thread = new Thread(() => { });
    
    // Thread önceliği
    thread.Priority = ThreadPriority.Highest;
    
    // Thread durumu
    bool isAlive = thread.IsAlive;
    
    // Thread adı
    thread.Name = "WorkerThread";
    

  3. Thread Bekletme

    // Thread'i belirli süre bekletme
    Thread.Sleep(1000); // 1 saniye
    
    // Thread'i sonsuza kadar bekletme
    thread.Join();
    

Thread Senkronizasyonu

  1. lock Kullanımı

    private object _lock = new object();
    private int _counter = 0;
    
    public void IncrementCounter()
    {
        lock (_lock)
        {
            _counter++;
        }
    }
    

  2. Monitor Kullanımı

    private object _monitor = new object();
    
    public void CriticalSection()
    {
        Monitor.Enter(_monitor);
        try
        {
            // Kritik kod
        }
        finally
        {
            Monitor.Exit(_monitor);
        }
    }
    

  3. Mutex Kullanımı

    private Mutex _mutex = new Mutex();
    
    public void ProtectedMethod()
    {
        _mutex.WaitOne();
        try
        {
            // Korunan kod
        }
        finally
        {
            _mutex.ReleaseMutex();
        }
    }
    

Thread Pool Kullanımı

  1. ThreadPool ile İş Yürütme

    ThreadPool.QueueUserWorkItem((state) => {
        Console.WriteLine("ThreadPool thread'i çalışıyor");
    });
    

  2. 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

  1. 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>();
    

  2. Volatile Değişkenler

    private volatile bool _isRunning = true;
    
    public void Stop()
    {
        _isRunning = false;
    }
    

  3. ThreadLocal Değişkenler

    private ThreadLocal<int> _threadLocal = new ThreadLocal<int>(() => 0);
    
    public void UseThreadLocal()
    {
        _threadLocal.Value = 42;
    }
    

Thread İletişimi

  1. AutoResetEvent Kullanımı

    private AutoResetEvent _event = new AutoResetEvent(false);
    
    public void SignalThread()
    {
        _event.Set();
    }
    
    public void WaitForSignal()
    {
        _event.WaitOne();
    }
    

  2. ManualResetEvent Kullanımı

    private ManualResetEvent _event = new ManualResetEvent(false);
    
    public void SignalAllThreads()
    {
        _event.Set();
    }
    
    public void ResetSignal()
    {
        _event.Reset();
    }
    

Thread İptali

  1. 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ı

  1. Thread Temelleri
  2. Thread nedir ve ne işe yarar?
  3. Process ve Thread arasındaki farklar nelerdir?
  4. Thread oluşturmanın maliyeti nedir?

  5. Thread Senkronizasyonu

  6. Race condition nedir ve nasıl önlenir?
  7. Deadlock nedir ve nasıl önlenir?
  8. lock, Monitor ve Mutex arasındaki farklar nelerdir?

  9. Thread Pool

  10. ThreadPool nedir ve ne zaman kullanılır?
  11. ThreadPool'un avantajları ve dezavantajları nelerdir?
  12. ThreadPool thread'leri nasıl yönetilir?

  13. Thread Güvenliği

  14. Thread-safe kod nedir?
  15. Volatile anahtar kelimesi ne işe yarar?
  16. ThreadLocal nedir ve ne zaman kullanılır?

  17. Thread İletişimi

  18. Thread'ler arası iletişim nasıl sağlanır?
  19. AutoResetEvent ve ManualResetEvent arasındaki farklar nelerdir?
  20. Thread'ler arası veri paylaşımı nasıl yapılır?

  21. Thread İptali

  22. Thread iptali nasıl yapılır?
  23. CancellationToken nasıl kullanılır?
  24. Thread iptalinde dikkat edilmesi gerekenler nelerdir?

  25. Performans

  26. Thread sayısı nasıl belirlenir?
  27. Thread'lerde performans optimizasyonu nasıl yapılır?
  28. Thread context switching nedir?

  29. Hata Yönetimi

  30. Thread'lerde exception handling nasıl yapılır?
  31. Unhandled exception'lar nasıl yakalanır?
  32. Thread'lerde hata raporlama nasıl yapılır?

  33. Resource Yönetimi

  34. Thread'lerde resource leak nasıl önlenir?
  35. Thread'lerde memory kullanımı nasıl yönetilir?
  36. Thread'lerde file handle'ları nasıl yönetilir?

  37. 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ı

  1. Thread-Safe Counter

    public class ThreadSafeCounter
    {
        private int _count = 0;
    
        public void Increment()
        {
            // Implementasyon
        }
    
        public int GetCount()
        {
            // Implementasyon
        }
    }
    

  2. Producer-Consumer Pattern

    public class ProducerConsumer
    {
        private Queue<int> _queue = new Queue<int>();
    
        public void Start()
        {
            // Implementasyon
        }
    }
    

  3. Thread Pool Manager

    public class ThreadPoolManager
    {
        public void ExecuteTask(Action task)
        {
            // Implementasyon
        }
    }
    

  4. Thread İptal Mekanizması

    public class CancellableOperation
    {
        public void Start(CancellationToken token)
        {
            // Implementasyon
        }
    }
    

  5. Thread Senkronizasyonu

    public class SynchronizedResource
    {
        private object _resource;
    
        public void AccessResource()
        {
            // Implementasyon
        }
    }
    

Kaynaklar