Neler yeni
Metin2 Support

Metin2 Dünyasına Hoş Geldiniz! Yeni bir maceraya adım atın ve topluluğumuza katılın. Sorularınızı sormak, deneyimlerinizi paylaşmak ve diğer oyuncularla iletişim kurmak için hemen kaydolun. Kayıt olun, etkileşimde bulunun ve Metin2 dünyasındaki serüveninizi daha da özel hale getirin. Birlikte oynamak için sabırsızlanıyoruz!

Multi-Thread Programlama Rehberi

ircoas

New member
Katılım
5 Haz 2025
Mesajlar
11
Tepkime puanı
6
Puanları
3
Multi-thread programlama, bir uygulamanın aynı süreç içerisinde birden fazla işi eş zamanlı veya paralel şekilde yürütebilmesini sağlayan programlama yaklaşımıdır.

Özellikle:

  • Oyunlar
  • Sunucu uygulamaları
  • Dosya işleme
  • Ağ işlemleri
  • Veri işleme
  • Arka plan görevleri
  • Masaüstü uygulamaları
gibi alanlarda oldukça önemlidir.

Ancak multi-thread programlama performans sağlayabildiği kadar yanlış kullanıldığında:

  • Race condition
  • Deadlock
  • Veri bozulması
  • Rastgele hatalar
  • Zor hata ayıklama süreçleri
gibi problemlere de neden olabilir.

Bu nedenle thread kullanmadan önce temel mantığını doğru anlamak gerekir.

Thread Nedir?​

Thread, bir program içerisindeki çalışma akışlarından biridir.

Bir uygulama başlatıldığında genellikle en az bir thread bulunur. Buna çoğunlukla:

Main Thread

yani ana thread denir.

Programın yaptığı işlemler başlangıçta bu ana thread üzerinde çalışabilir.

Ancak uygulamanın aynı anda birden fazla işi yönetmesi gerektiğinde ek thread'ler kullanılabilir.

Process ile Thread Arasındaki Fark​

Process, çalışan uygulamanın kendisidir.

Thread ise bu uygulama içerisindeki çalışma birimlerinden biridir.

Örneğin bir program tek bir process olarak çalışırken içerisinde:

  • Ana thread
  • Ağ thread'i
  • Dosya işleme thread'i
  • Arka plan worker thread'i
bulunabilir.

Bir process içerisinde çok sayıda thread çalışabilir.

Thread'ler Aynı Belleği Kullanır mı?​

Aynı process içerisinde bulunan thread'ler birçok ortak kaynağa erişebilir.

Örneğin:

  • Heap
  • Global değişkenler
  • Program içerisindeki nesneler
  • Açık dosyalar
  • Process kaynakları
paylaşılabilir.

Bu durum performans açısından avantajlıdır.

Ancak aynı zamanda multi-thread programlamanın en büyük risklerinden biridir.

İki thread aynı veriyi aynı anda değiştirmeye çalışırsa beklenmeyen sonuçlar ortaya çıkabilir.

1 FSEGozbKSrPGlBDf4Dl0Zg

Multi-Thread Ne İşe Yarar?​

Bir uygulamanın farklı görevlerini aynı anda ilerletebilmesine yardımcı olur.

Örneğin bir oyun içerisinde aynı anda:

  • Grafik işlemleri
  • Fizik hesaplamaları
  • Ses
  • Ağ bağlantısı
  • Dosya yükleme
  • Yapay zeka
gibi farklı işler gerçekleştirilebilir.

Bütün işlemlerin tek thread üzerinde yapılması bazı durumlarda darboğaz oluşturabilir.

Doğru tasarlanmış multi-thread sistemlerde bazı görevler farklı işlemci çekirdeklerine dağıtılabilir.

Multi-Tasking ile Multi-Thread Aynı Şey mi?​

Hayır.

Multi-tasking, işletim sisteminin aynı anda birden fazla programı çalıştırabilmesini ifade eder.

Örneğin aynı anda:

  • Tarayıcı
  • Discord
  • Oyun
  • OBS Studio
çalışabilir.

Multi-thread ise tek bir programın kendi içerisinde birden fazla çalışma akışı kullanmasıdır.

Concurrency Nedir?​

Concurrency, birden fazla işin aynı zaman dilimi içerisinde ilerlemesidir.

Bu işler fiziksel olarak tam olarak aynı anda çalışmak zorunda değildir.

İşletim sistemi farklı thread'ler arasında çok hızlı geçiş yaparak birden fazla iş aynı anda ilerliyormuş gibi davranabilir.

Parallelism Nedir?​

Parallelism yani paralellik, iki veya daha fazla işlemin gerçekten aynı anda farklı işlemci çekirdeklerinde çalışmasıdır.

Örneğin:

  • Birinci çekirdek bir hesaplama yaparken
  • İkinci çekirdek başka bir hesaplama yapabilir.
Bu durumda gerçek paralellik oluşur.

Concurrency ile Parallelism Arasındaki Fark​

Basit şekilde:

Concurrency → Birden fazla işi birlikte yönetmek

Parallelism → Birden fazla işi gerçekten aynı anda çalıştırmak


olarak düşünülebilir.

Multi-thread kullanan her program mutlaka tamamen paralel çalışmaz.

CPU Çekirdeği ile Thread Arasındaki İlişki​

Modern işlemcilerde birden fazla fiziksel çekirdek bulunur.

Ayrıca bazı işlemciler bir fiziksel çekirdeğin birden fazla mantıksal thread çalıştırabilmesini sağlar.

Örneğin bir işlemci:

8 çekirdek / 16 thread

şeklinde olabilir.

Ancak program içerisinde 16 thread oluşturmak otomatik olarak maksimum performans sağlayacağı anlamına gelmez.

Daha Fazla Thread Daha Fazla Performans mı?​

Hayır.

Multi-thread programlamada en sık yapılan yanlışlardan biridir.

Çok fazla thread oluşturulduğunda:

  • Thread yönetimi
  • Context switch
  • Synchronization
  • CPU cache kullanımı
gibi ek maliyetler oluşabilir.

Bu nedenle gereksiz yere yüzlerce thread oluşturmak programı hızlandırmak yerine yavaşlatabilir.

Context Switch Nedir?​

İşletim sisteminin bir thread'i durdurup başka bir thread'i işlemci üzerinde çalıştırmasına context switch denir.

Bu geçiş sırasında mevcut thread'in çalışma durumu saklanır ve yeni thread'in bilgileri yüklenir.

Context switch normal bir işlemdir.

Ancak çok fazla thread varsa bu geçişlerin sayısı artabilir.

Bunun sonucunda işlemcinin önemli bir bölümü gerçek işi yapmak yerine thread'ler arasında geçiş yapmakla uğraşabilir.

Main Thread Nedir?​

Ana thread, uygulamanın temel çalışma akışıdır.

Özellikle:

  • Masaüstü uygulamalarında
  • Oyun motorlarında
  • Kullanıcı arayüzlerinde
önemlidir.

Ekrandaki arayüzün büyük bölümü genellikle ana thread tarafından yönetilir.

Ana thread uzun süre bloke edilirse program donmuş gibi görünebilir.

Worker Thread Nedir?​

Ana programdan bağımsız olarak belirli işleri gerçekleştiren yardımcı thread'lere genel olarak worker thread denilebilir.

Örneğin:

  • Büyük hesaplama
  • Dosya işleme
  • Veri sıkıştırma
  • Arka plan işlemleri
worker thread üzerinden gerçekleştirilebilir.

Thread Pool Nedir?​

Her iş için yeni bir thread oluşturmak maliyetlidir.

Bu nedenle modern programlama ortamlarında önceden hazırlanmış thread havuzları kullanılabilir.

Thread Pool mantığında hazır thread'ler bulunur.

Yeni bir iş geldiğinde uygun thread görevi gerçekleştirir ve iş bittikten sonra tekrar havuza döner.

Bu yöntem sürekli yeni thread oluşturup yok etmekten daha verimli olabilir.

Task Nedir?​

Modern programlama dillerinde doğrudan thread yönetmek yerine görev tabanlı sistemler kullanılabilir.

C# tarafında bunun en önemli örneklerinden biri:

Task

sistemidir.

Task, gerçekleştirilecek bir işi temsil eder.

Task kullanıldığında sistem çoğu durumda thread pool içerisindeki mevcut thread'leri kullanabilir.

Bu nedenle doğrudan düşük seviyeli thread yönetimine göre daha kolay ve güvenli olabilir.

CPU-Bound İş Nedir?​

İşlemciyi yoğun şekilde kullanan işlemlerdir.

Örneğin:

  • Matematiksel hesaplamalar
  • Görüntü işleme
  • Video encode
  • Veri sıkıştırma
  • Şifreleme
  • Büyük veri analizleri
CPU-bound olarak değerlendirilebilir.

Bu tür işlerin bağımsız bölümleri varsa farklı CPU çekirdeklerine dağıtılarak performans artırılabilir.

I/O-Bound İş Nedir?​

CPU'dan çok dış kaynakların beklenmesini gerektiren işlemlerdir.

Örneğin:

  • İnternetten veri indirmek
  • Dosya okumak
  • Veritabanı sorgusu
  • Ağ bağlantısı
I/O-bound işlemlerdir.

Bu işlemlerde program çoğu zaman işlemci kullanmak yerine veri gelmesini bekler.

Bu nedenle sadece daha fazla thread oluşturmak yerine asenkron programlama yaklaşımı daha mantıklı olabilir.

Async ile Multi-Thread Aynı mı?​

Hayır.

Bu iki kavram sık sık karıştırılır.

Asenkron programlama kullanıldığında kod mutlaka farklı bir thread üzerinde çalışmak zorunda değildir.

Özellikle ağ veya dosya işlemlerinde program bir thread'i boş yere bekletmek yerine işlem tamamlandığında devam edebilir.

Bu nedenle:

Async → Thread oluşturmak

şeklinde düşünmek yanlış olur.

Blocking Nedir?​

Bir thread'in belirli bir işlem tamamlanana kadar başka hiçbir şey yapmadan beklemesine blocking denir.

Örneğin ana thread uzun süre bekletilirse kullanıcı arayüzü yanıt vermeyebilir.

Bu nedenle uzun süren işler mümkün olduğunda ana thread dışında yönetilmelidir.

Kullanıcı Arayüzü Neden Donar?​

Masaüstü uygulamalarında pencere ve kullanıcı arayüzü çoğunlukla ana thread üzerinden yönetilir.

Ana thread üzerinde çok uzun süren bir hesaplama yapılırsa:

  • Butonlara basılamaz.
  • Pencere hareket ettirilemez.
  • Ekran güncellenmez.
Program kullanıcı açısından donmuş gibi görünür.

Bu nedenle uzun süren hesaplamalar uygun şekilde arka plana aktarılabilir.

Race Condition Nedir?​

Multi-thread programlamadaki en önemli problemlerden biridir.

İki veya daha fazla thread aynı veriyi aynı anda değiştirmeye çalıştığında işlemlerin sırasına bağlı olarak farklı sonuçlar ortaya çıkabilir.

Örneğin iki thread aynı sayaç değerini aynı anda okuyup artırmaya çalışırsa beklenen artışlardan biri kaybolabilir.

Bu duruma:

Race Condition

denir.

Race Condition Neden Tehlikelidir?​

Çünkü hata her zaman oluşmayabilir.

Program:

  • 100 kez doğru
    1. çalıştırmada yanlış
davranabilir.

Bu nedenle race condition problemlerini bulmak normal hatalara göre çok daha zor olabilir.

Critical Section Nedir?​

Birden fazla thread'in aynı anda çalıştırmasının güvenli olmadığı kod veya işlem bölümüdür.

Örneğin banka hesabındaki bakiye değiştiriliyorsa aynı anda iki thread'in kontrolsüz şekilde bakiyeyi değiştirmesi istenmez.

Bu tür alanlar özel senkronizasyon yöntemleriyle korunur.

Lock Nedir?​

Lock, belirli bir kaynağa aynı anda yalnızca bir thread'in erişmesini sağlamak için kullanılan senkronizasyon yöntemlerinden biridir.

Bir thread kilitli bölgedeyken başka bir thread aynı bölgeye girmek isterse beklemek zorunda kalabilir.

Bu sayede paylaşılan verinin aynı anda birden fazla thread tarafından değiştirilmesi önlenebilir.

Her Yere Lock Koymak Doğru mu?​

Hayır.

Gereğinden fazla lock kullanmak:

  • Performansı düşürebilir.
  • Paralelliği azaltabilir.
  • Deadlock oluşturabilir.
Bu nedenle yalnızca gerçekten korunması gereken ortak kaynaklarda kullanılmalıdır.

Thread-Safe Nedir?​

Bir yapı birden fazla thread tarafından aynı anda kullanıldığında doğru çalışmaya devam ediyorsa:

Thread-safe

olarak adlandırılır.

Her veri yapısı thread-safe değildir.

Özellikle klasik liste ve sözlük yapılarının aynı anda birden fazla thread tarafından değiştirilmesi sorun oluşturabilir.

Concurrent Collections Nedir?​

Çoklu thread kullanımı düşünülerek tasarlanmış veri yapılarıdır.

Örneğin:

  • Thread-safe dictionary
  • Thread-safe queue
  • Thread-safe stack
gibi yapılar kullanılabilir.

Bu veri yapıları multi-thread uygulamalarda paylaşılan koleksiyonların yönetimini kolaylaştırabilir.

Atomic Operation Nedir?​

Bir işlemin başka thread tarafından araya girilemeden tek parça halinde gerçekleştirilmesine atomic operation denir.

Basit sayaç artırma gibi işlemler için bazı programlama ortamlarında özel atomik işlemler bulunur.

Bu yöntem küçük işlemlerde lock kullanmaktan daha verimli olabilir.

Mutex Nedir?​

Mutex, aynı anda yalnızca bir işlem veya thread'in belirli kaynağa erişmesini sağlayan senkronizasyon yöntemlerinden biridir.

Lock sistemine benzer.

Ancak bazı işletim sistemlerinde Mutex farklı process'ler arasında da kullanılabilir.

Bu nedenle daha ağır bir mekanizma olabilir.

Semaphore Nedir?​

Semaphore, belirli bir kaynağa aynı anda kaç thread'in erişebileceğini sınırlamak için kullanılır.

Örneğin sunucunuzun aynı anda maksimum:

10 işlem

yapmasını istiyorsanız semaphore kullanılabilir.

On birinci işlem, diğerlerinden biri tamamlanana kadar bekleyebilir.

Semaphore Nerede Kullanılır?​

Özellikle:

  • API istekleri
  • Veritabanı bağlantıları
  • Dosya işleme
  • Download işlemleri
gibi sınırlı sayıda paralel işlem yapılması gereken durumlarda faydalıdır.

Deadlock Nedir?​

Multi-thread programlamadaki en tehlikeli sorunlardan biridir.

İki veya daha fazla thread birbirinin tuttuğu kaynağı bekler ve hiçbirisi ilerleyemezse deadlock oluşur.

Örneğin:

  • Birinci thread Kaynak A'yı tutar ve Kaynak B'yi bekler.
  • İkinci thread Kaynak B'yi tutar ve Kaynak A'yı bekler.
İkisi de birbirini beklediği için uygulama ilgili bölümde sonsuza kadar takılabilir.

Deadlock Nasıl Önlenir?​

Bazı temel yöntemler:

  • Kilitleri her zaman aynı sırada almak
  • Lock sayısını azaltmak
  • Lock içerisinde uzun işlem yapmamak
  • Gerektiğinde timeout kullanmak
şeklindedir.

Multi-thread tasarımında deadlock ihtimali daha kod yazılırken düşünülmelidir.

Starvation Nedir?​

Bir thread'in sürekli diğer thread'lerin arkasında kalması ve ihtiyacı olan CPU zamanı veya kaynağı yeterince alamamasına starvation denir.

Thread tamamen kilitli değildir ancak uzun süre ilerleyemez.

Livelock Nedir?​

Thread'lerin teknik olarak çalışmaya devam ettiği ancak birbirlerinin davranışlarına sürekli tepki verdikleri için gerçek işin ilerlemediği durumdur.

Deadlock'ta thread'ler bekler.

Livelock'ta ise hareket vardır ancak ilerleme yoktur.

Memory Visibility Nedir?​

Bir thread'in yaptığı değişikliğin diğer thread tarafından ne zaman görüleceği önemlidir.

Modern işlemciler:

  • CPU cache
  • Compiler optimizasyonları
  • İşlem sıralaması
kullanabilir.

Bu nedenle thread'ler arasında veri paylaşımı düşündüğünüzden daha karmaşık olabilir.

Lock ve benzeri senkronizasyon araçları bu problemlerin yönetilmesine yardımcı olur.

Scheduler Nedir?​

İşletim sistemi içerisindeki scheduler, hangi thread'in hangi anda hangi işlemci çekirdeğinde çalışacağını belirler.

Programcı thread oluşturabilir ancak thread'in CPU üzerinde tam olarak ne zaman çalışacağını doğrudan kontrol etmez.

Bu nedenle iki thread'in hangi sırayla çalışacağına güvenerek program yazmak doğru değildir.

Thread Priority Nedir?​

Bazı sistemlerde thread'lere farklı öncelikler verilebilir.

Yüksek öncelikli thread daha fazla CPU zamanı elde edebilir.

Ancak thread priority performans optimizasyonu için rastgele kullanılmamalıdır.

Genellikle işletim sistemi scheduler'ının işi yönetmesine izin vermek daha sağlıklıdır.

Paralel Döngüler Ne İşe Yarar?​

Büyük ve bağımsız veri kümeleri üzerinde aynı işlemi yapmak gerekiyorsa iş farklı işlemci çekirdeklerine dağıtılabilir.

Örneğin:

  • Binlerce resim işleme
  • Büyük matematik dizileri
  • Veri dönüştürme
gibi işlemler paralelleştirilebilir.

Ancak her döngünün paralel yapılması daha hızlı sonuç vermez.

Küçük İşlerde Multi-Thread Kullanmak Mantıklı mı?​

Genellikle hayır.

Çok küçük bir işlem için thread oluşturma ve senkronizasyon maliyeti işlemin kendisinden daha büyük olabilir.

Bu nedenle multi-thread optimizasyonu yapmadan önce darboğazın gerçekten nerede olduğu ölçülmelidir.

Cancellation Nedir?​

Uzun süren işlemlerin güvenli şekilde iptal edilebilmesini sağlar.

Örneğin kullanıcı büyük bir dosya işlemini başlattıktan sonra:

İptal

butonuna basabilir.

İşin thread'i zorla kapatılmak yerine kontrollü şekilde durdurulması daha güvenlidir.

Bu sayede:

  • Açık dosyalar kapatılabilir.
  • Bellek temizlenebilir.
  • Yarım veri bırakılması önlenebilir.

Thread'i Zorla Kapatmak Neden Risklidir?​

Thread herhangi bir işlemin ortasında olabilir.

Örneğin:

  • Dosyaya yazıyor olabilir.
  • Veritabanını değiştiriyor olabilir.
  • Paylaşılan veriyi güncelliyor olabilir.
Tam bu sırada zorla kapatılırsa veri tutarsızlığı oluşabilir.

Bu nedenle kontrollü iptal mekanizmaları tercih edilir.

Producer-Consumer Modeli Nedir?​

Multi-thread programlamada oldukça yaygın bir tasarım modelidir.

Bir veya daha fazla thread veri üretir.

Başka thread'ler bu veriyi işler.

Örneğin:

  • Ağ thread'i mesajları alır.
  • Mesajları kuyruğa ekler.
  • Worker thread'ler kuyruğu işler.
Özellikle sunucu uygulamalarında oldukça faydalıdır.

Queue Sistemleri Neden Faydalı?​

Görevleri doğrudan worker'a vermek yerine araya bir kuyruk koymak sistemi daha kontrollü hale getirebilir.

Görevler sıraya alınır ve worker'lar uygun oldukça işleri gerçekleştirir.

Bu yaklaşım:

  • Ani yük artışlarını
  • Thread sayısını
  • İş sırasını
daha kolay yönetmeyi sağlar.

Oyunlarda Multi-Thread Nasıl Kullanılır?​

Modern oyunlar tek bir thread üzerinden çalışmaz.

Oyun motorları farklı görevleri çeşitli thread'lere dağıtabilir.

Örneğin:

  • Fizik
  • Ses
  • Asset yükleme
  • Network
  • Yapay zeka
  • Animasyon hazırlama
farklı worker thread'lerden yararlanabilir.

Oyunlarda Main Thread Neden Hâlâ Önemli?​

Her şey paralelleştirilemez.

Birçok oyun motorunda:

  • Sahne yönetimi
  • GameObject işlemleri
  • Bazı rendering işlemleri
ana thread'e bağlıdır.

Bu nedenle işlemcinin tek çekirdek performansı oyunlarda hâlâ önemlidir.

Unity'de Multi-Thread​

Unity multi-thread sistemleri kullanabilir ancak Unity API'nin önemli bir bölümü ana thread üzerinden çalışmak üzere tasarlanmıştır.

Bu nedenle arka planda yapılan hesaplamanın sonucunun:

Main Thread

üzerine güvenli şekilde aktarılması gerekebilir.

Unity Job System Nedir?​

Unity'nin çok çekirdekli işlemcilerden daha verimli faydalanmak için sunduğu sistemlerden biridir.

Büyük işleri küçük görevlere bölüp worker thread'lere dağıtmayı kolaylaştırır.

Özellikle çok sayıda benzer hesaplama yapılan sistemlerde kullanışlı olabilir.

Sunucu Programlamasında Multi-Thread​

Sunucu uygulamalarında aynı anda:

  • Yüzlerce
  • Binlerce
  • On binlerce
kullanıcı bağlantısı olabilir.

Her kullanıcı için ayrı işletim sistemi thread'i oluşturmak her zaman verimli değildir.

Bu nedenle modern sunucular genellikle:

  • Async I/O
  • Thread Pool
  • Event tabanlı sistemler
kullanır.

Network Uygulamalarında Async Neden Önemli?​

Ağ bağlantılarında CPU genellikle karşı taraftan veri gelmesini bekler.

Bu süre boyunca bir thread'i tamamen bekletmek yerine asenkron yapı kullanmak daha verimli olabilir.

Böylece az sayıda thread ile çok daha fazla bağlantı yönetilebilir.

Web Sunucularında Neden Binlerce Thread Yok?​

Modern web sunucuları her bağlantı için bir thread oluşturmak yerine daha gelişmiş iş modelleri kullanabilir.

Amaç:

Çok sayıda bağlantıyı az miktarda sistem kaynağıyla yönetmektir.

Bu nedenle özellikle yüksek trafik alan web uygulamalarında async programlama oldukça önemlidir.

Veritabanı İşlemlerinde Multi-Thread​

Veritabanı sorguları çoğu durumda I/O işlemleridir.

Program:

  • Sorguyu gönderir.
  • Veritabanının cevap vermesini bekler.
Bu nedenle her sorgu için yeni thread oluşturmak yerine asenkron veritabanı API'leri daha verimli olabilir.

Dosya İşlemlerinde Multi-Thread​

Birden fazla bağımsız dosya işlenecekse paralellik faydalı olabilir.

Ancak aynı diske çok fazla paralel işlem göndermek:

  • Disk kuyruğunu artırabilir.
  • I/O gecikmesini yükseltebilir.
Bu nedenle paralellik miktarı sınırlandırılmalıdır.

Thread Sayısı Nasıl Belirlenir?​

Tek bir doğru sayı yoktur.

İşin türüne bağlıdır.

CPU ağırlıklı işlerde işlemci çekirdeklerinin sayısı önemlidir.

I/O ağırlıklı işlerde ise daha fazla eş zamanlı görev kullanılabilir.

En doğru değer:

Benchmark ve profiling

ile belirlenmelidir.

8 Çekirdekte 8 Thread Kullanmak Zorunlu mu?​

Hayır.

Uygulamaya bağlı olarak:

  • 4 worker
  • 8 worker
  • 16 worker
farklı performans gösterebilir.

İşlem CPU ağırlıklıysa aşırı thread kullanımı zarar verebilir.

I/O ağırlıklıysa çekirdek sayısından daha fazla görev mantıklı olabilir.

Thread Local Data Nedir?​

Her thread'in kendisine özel veri kullanmasıdır.

Bu yöntem ortak veri kullanımını azaltabilir.

Bir veri yalnızca tek thread tarafından kullanılabiliyorsa synchronization ihtiyacı da azalır.

Immutable Data Nedir?​

Oluşturulduktan sonra değiştirilmeyen veri yapılarıdır.

Multi-thread programlamada oldukça faydalıdır.

Çünkü birden fazla thread aynı veriyi yalnızca okuyorsa yarış durumu oluşma ihtimali ciddi şekilde azalır.

Shared Mutable State Nedir?​

Birden fazla thread tarafından değiştirilebilen ortak verilerdir.

Multi-thread programlamadaki problemlerin büyük bölümü bu yapıdan kaynaklanır.

Örneğin aynı oyuncu listesini birden fazla thread'in değiştirmesi kontrol edilmezse sorun çıkabilir.

Paylaşılan Veriyi Azaltmak Neden Önemli?​

En kolay thread-safe kod, mümkün olduğunca az veri paylaşan koddur.

Bu nedenle iyi multi-thread tasarımlarda:

  • Thread'ler kendi verileri üzerinde çalışabilir.
  • Mesajlaşma kullanılabilir.
  • Kuyruk sistemleri kullanılabilir.
  • Immutable veri tercih edilebilir.
Bu yaklaşım lock ihtiyacını azaltır.

Multi-Thread Debugging Neden Zordur?​

Çünkü thread çalışma sırası her seferinde farklı olabilir.

Bir hata:

  • İlk çalıştırmada çıkmayabilir.
  • İkinci çalıştırmada çıkabilir.
  • Sadece yoğun yükte görülebilir.
Bu nedenle multi-thread problemleri genellikle normal programlama hatalarından daha zor bulunur.

Loglama Neden Önemlidir?​

Multi-thread uygulamalarda log kayıtlarına:

  • Saat
  • Thread bilgisi
  • İşlem adı
  • Kullanıcı veya görev bilgisi
eklenmesi faydalıdır.

Bu sayede hangi işlemin hangi sırayla gerçekleştiğini takip etmek daha kolay olur.

Profiling Nedir?​

Programın performansını ölçmek için kullanılan analiz yöntemidir.

Profiling ile:

  • Hangi thread ne kadar CPU kullanıyor?
  • Nerede bekliyor?
  • Hangi işlem darboğaz oluşturuyor?
  • Lock bekleme süresi ne kadar?
gibi soruların cevabı bulunabilir.

Önce Profiling Sonra Multi-Thread​

Performans sorunu olan programı doğrudan multi-thread yapmak doğru değildir.

Öncelikle sorun tespit edilmelidir.

Örneğin programın yavaşlığı diskten kaynaklanıyorsa daha fazla CPU thread'i eklemek problemi çözmez.

Hatta daha kötü hale getirebilir.

False Sharing Nedir?​

İleri seviye multi-thread performans problemlerinden biridir.

İki thread farklı değişkenleri kullanıyor olsa bile değişkenler CPU cache içerisinde birbirine çok yakın konumdaysa çekirdekler arasında gereksiz cache senkronizasyonu oluşabilir.

Bu durum özellikle yüksek performanslı sistemlerde önemlidir.

CPU Cache Neden Önemlidir?​

İşlemciler RAM'e göre çok daha hızlı olan:

  • L1 Cache
  • L2 Cache
  • L3 Cache
kullanır.

Thread'lerin sürekli aynı veriler üzerinde çalışması çekirdekler arasında cache senkronizasyon maliyeti oluşturabilir.

Bu nedenle multi-thread performansı yalnızca thread sayısına bağlı değildir.

Amdahl Yasası Nedir?​

Programın tamamı paralelleştirilemiyorsa işlemci çekirdeği sayısını artırmanın bir noktadan sonra faydası azalır.

Örneğin programın önemli bir bölümü mutlaka tek thread üzerinde çalışmak zorundaysa diğer bölümlerin çok hızlı çalışması toplam performansı sınırsız artırmaz.

Bu nedenle:

Daha fazla çekirdek = Her zaman aynı oranda daha hızlı program

değildir.

Multi-Thread Kullanılması Mantıklı Olan İşler​

Özellikle:

  • Büyük matematiksel hesaplamalar
  • Görüntü işleme
  • Video işleme
  • Veri sıkıştırma
  • Büyük veri setleri
  • Arka plan worker işlemleri
için değerlendirilebilir.

Async Kullanılması Daha Mantıklı Olan İşler​

Özellikle:

  • HTTP istekleri
  • Veritabanı sorguları
  • Ağ bağlantıları
  • Dosya okuma/yazma
  • Bekleme işlemleri
için asenkron yaklaşım daha mantıklı olabilir.

Multi-Thread Kullanılmaması Gereken Durumlar​

Çok küçük veya tamamen sıralı yapılması gereken işlerde gereksizdir.

Thread oluşturmak da ücretsiz değildir.

Çok kısa süren bir işlemi farklı thread'e taşımak toplam çalışma süresini artırabilir.

Multi-Thread Programlamada En Sık Yapılan Hatalar​

Her İş İçin Yeni Thread Oluşturmak​

Thread Pool veya görev tabanlı sistemler daha mantıklı olabilir.

Paylaşılan Veriyi Korumasız Kullanmak​

Race condition oluşturabilir.

Her Yere Lock Koymak​

Programın paralel çalışma avantajını ortadan kaldırabilir.

Lock İçerisinde Uzun İş Yapmak​

Diğer thread'lerin gereksiz yere beklemesine neden olur.

Async ile Thread'i Aynı Sanmak​

İki kavram farklıdır.

Sabit Süre Bekleyerek Senkronizasyon Yapmak​

Diğer işlemin belirtilen sürede tamamlanacağının garantisi yoktur.

Gereğinden Fazla Worker Kullanmak​

Context switch ve CPU kullanımını artırır.

Main Thread'i Bloke Etmek​

Kullanıcı arayüzünü veya oyunu dondurabilir.

Cancellation Sistemini Unutmak​

Uzun işlemlerin güvenli şekilde durdurulmasını zorlaştırır.

Yeni Başlayanlar İçin Öğrenme Sırası​

Multi-thread programlamaya yeni başlayan birinin şu sırayla ilerlemesi daha mantıklıdır:

  1. Process nedir?
  2. Thread nedir?
  3. Main Thread
  4. Concurrency
  5. Parallelism
  6. Thread Pool
  7. Task mantığı
  8. Async/await
  9. Race Condition
  10. Lock
  11. Atomic işlemler
  12. Thread-safe koleksiyonlar
  13. Semaphore
  14. Deadlock
  15. Cancellation
  16. Producer-Consumer
  17. Profiling
Bu kavramlar öğrenildikten sonra daha gelişmiş paralel programlama sistemlerine geçilebilir.

Pratik Proje Önerileri​

Multi-thread mantığını öğrenmek için basit projeler yapılabilir.

Örneğin bir dosya işleme uygulamasında:

  • Bir klasördeki dosyalar bulunabilir.
  • İşler sıraya eklenebilir.
  • Birkaç worker aynı anda dosyaları işleyebilir.
  • Kullanıcı istediğinde işlem iptal edilebilir.
Bu proje:

  • Queue
  • Worker
  • Thread safety
  • Cancellation
konularını anlamaya yardımcı olur.

Download Manager Projesi​

Başka bir iyi örnek download manager uygulamasıdır.

Örneğin:

  • 20 dosya indirilecek.
  • Aynı anda maksimum 3 indirme çalışacak.
  • Biten indirmeden sonra yenisi başlayacak.
  • Kullanıcı işlemleri iptal edebilecek.
Bu proje concurrency ve sınırlı paralellik mantığını öğrenmek için oldukça faydalıdır.

Oyun Sunucusu Örneği​

Oyun sunucusunda:

  • Network işlemleri
  • Veritabanı
  • Oyuncu verileri
  • Log sistemi
birbirinden ayrılabilir.

Ancak aynı oyuncunun verisine farklı thread'lerin aynı anda müdahale etmesi ciddi hatalar oluşturabilir.

Bu nedenle sunucu geliştirmede thread-safe tasarım oldukça önemlidir.

Multi-Thread Programlama Kontrol Listesi​

  • İş gerçekten paralelleştirilmeye uygun mu?
  • CPU-bound mı I/O-bound mı?
  • Async kullanmak daha mantıklı mı?
  • Paylaşılan veri var mı?
  • Race condition oluşabilir mi?
  • Lock gerçekten gerekli mi?
  • Lock sayısı fazla mı?
  • Deadlock oluşabilir mi?
  • Thread-safe veri yapısı kullanılabilir mi?
  • Paralellik sınırlandırılmalı mı?
  • Cancellation desteği var mı?
  • Main thread bloke oluyor mu?
  • Thread sayısı gereğinden fazla mı?
  • Profiling yapıldı mı?
  • Multi-thread sürümü gerçekten daha hızlı mı?

Sonuç​

Multi-thread programlama, modern işlemcilerin birden fazla çekirdeğinden yararlanmak ve uygulamaların aynı anda birden fazla işi yönetmesini sağlamak için kullanılan güçlü bir programlama yaklaşımıdır.

Ancak amaç:

Mümkün olduğunca fazla thread oluşturmak

değildir.

Asıl amaç doğru işi doğru çalışma modeliyle yürütmektir.

Genel olarak:

CPU ağırlıklı işler → Paralel çalışma

Ağ ve dosya işlemleri → Asenkron çalışma

Paylaşılan veri → Senkronizasyon

Çok sayıda küçük görev → Thread Pool

Sınırlı eş zamanlı çalışma → Semaphore benzeri sistemler


şeklinde düşünülebilir.

Multi-thread programlamada en önemli riskler:

  • Race condition
  • Deadlock
  • Starvation
  • Veri tutarsızlığı
  • Gereksiz thread kullanımı
olarak öne çıkar.

Bu nedenle bir uygulamanın performansını artırmak için doğrudan thread eklemek yerine önce gerçek darboğazın nerede olduğu ölçülmelidir.

İyi multi-thread kod, en fazla thread kullanan kod değildir.

Paylaşılan veriyi minimumda tutan, thread'ler arasındaki iletişimi düzgün yöneten, gereksiz kilitlemeden kaçınan ve yalnızca gerçekten ihtiyaç duyulan işleri paralelleştiren kod daha sağlıklı bir tasarımdır.
 

Konuyu görüntüleyenler

  • Üst