Yukarıdaki cevapların çoğu performans ve eşzamanlı çalışma hakkında konuşmaktadır. Buna farklı bir açıdan yaklaşacağım.
Basit bir terminal öykünme programı örneğini ele alalım. Aşağıdaki şeyleri yapmak zorundasınız:
- uzaktaki sistemden gelen karakterleri izleyin ve görüntüleyin
- klavyeden gelen şeyleri izleyin ve uzak sisteme gönderin
(Gerçek terminal emülatörleri, yazdığınız şeylerin ekrana da yansıtılması da dahil olmak üzere daha fazlasını yapar, ancak şimdilik bunu geçeceğiz.)
Şimdi, aşağıdaki sahte kodlara göre uzaktan kumandadan okuma döngüsü basit:
while get-character-from-remote:
print-to-screen character
Klavyeyi izleme ve gönderme döngüsü de basittir:
while get-character-from-keyboard:
send-to-remote character
Ancak sorun, bunu aynı anda yapmanız gerektiğidir. Eğer iş parçacığına sahip değilseniz, kod şimdi daha fazla görünmelidir:
loop:
check-for-remote-character
if remote-character-is-ready:
print-to-screen character
check-for-keyboard-entry
if keyboard-is-ready:
send-to-remote character
İletişimin gerçek dünyadaki karmaşıklığını hesaba katmayan kasıtlı olarak basitleştirilmiş bu örnekte bile mantık oldukça gizlidir. Bununla birlikte, diş açma ile, tek bir çekirdek üzerinde bile, iki sahte kod döngüsü mantıklarını birbirine bağlamadan bağımsız olarak var olabilir. Her iki iş parçacığı çoğunlukla G / Ç'ye bağlı olacağından, kesin olarak konuşursak, entegre döngüden daha fazla CPU kaynağı israf etseler bile CPU'ya ağır bir yük yüklemezler.
Şimdi elbette gerçek dünya kullanımı yukarıdakilerden daha karmaşık. Ancak, uygulamaya daha fazla endişe ekledikçe, tümleşik döngünün karmaşıklığı katlanarak artar. Mantık gittikçe parçalanır ve işleri yönetilebilir hale getirmek için devlet makineleri, yardımcı programlar ve diğerleri gibi teknikleri kullanmaya başlamanız gerekir. Yönetilebilir, ancak okunamaz. Diş açma kodu daha okunaklı tutar.
Peki neden ipliği kullanmıyorsunuz?
Görevleriniz I / O-bağlı yerine CPU-bağlıysa, iş parçacığı gerçekte sisteminizi yavaşlatır. Performans düşecektir. Pek çok durumda. (Çok fazla CPU'ya bağlı iş parçacığı bırakırsanız "Thrashing" yaygın bir sorundur. Etkin iş parçacıklarını değiştirmek için iş parçacıklarının içeriğini çalıştırdığınızdan daha fazla zaman harcarsınız.) Ayrıca, yukarıdaki mantığın nedenlerinden biri de o kadar basit ki, kasten basit (ve gerçekçi olmayan) bir örnek seçtim. Ekrana yazılanları yankılamak istiyorsanız, paylaşılan kaynakların kilitlenmesini tanıtırken yeni bir acı dünyasına sahipsiniz. Tek bir paylaşılan kaynakla bu çok sorun değil, ancak daha fazla kaynağınız olduğu için daha büyük ve daha büyük bir sorun olmaya başlıyor.
Sonuçta, iplik geçirme birçok şeyle ilgilidir. Örneğin, bazılarının söylediği gibi, G / Ç'ye bağlı işlemleri daha duyarlı (genel olarak daha az verimli olsa bile) yapmakla ilgilidir. Aynı zamanda mantığı daha kolay takip etmekle ilgilidir (ancak yalnızca paylaşılan durumu en aza indirirseniz). Bu bir çok şey hakkında ve avantajlarının dezavantajlarını duruma göre ağır basmayacağına karar vermelisiniz.