Konunun Tarihi
Threadler, Perl'de çoklu görevli programlarda rekabetçi hesaplamalar ve kaynaklarla paralel çalışma ihtiyacına yanıt olarak ortaya çıkmıştır. Standart threads modülü, 5.8 sürümünden itibaren Perl'e dahil olmuş, zamanla ithreads ile yapılan denemelerden universal threads::shared'e geçmiştir.
Problem
İlk zorluk, Perl'in threadleri yerel olarak desteklememesidir; bu, Java gibi dillerdeki uygulanışı kadar entegre değildir. Perl'deki threadler, her thread'in yığını ve verilerini kopyalayarak çalışmakta ve bu da fazla yük oluşturmakta, global değişkenlerle doğrudan çalışmayı imkansız hale getirmektedir (threads::shared aracılığıyla özel bağlama sahip değişkenler hariç). Ayrıca, Perl aynı anda veri yazarken threadlerin bağımsız çalışmasını garanti etmez, dolayısıyla açık bir senkronizasyon gereklidir.
Çözüm
Threadleri organize etmek için threads modülü ve threadler arasında veri alışverişi için ek threads::shared modülü kullanılır. Veri senkronizasyonu ve bütünlüğünü sağlamak tamamen geliştiricinin sorumluluğundadır, genellikle lock kullanımı yoluyla.
Kod örneği:
use threads; use threads::shared; my $counter :shared = 0; sub increment { lock($counter); $counter++; } my @threads; for (1..10) { push @threads, threads->create(\&increment); } $_->join for @threads; print "Counter: $counter ";
Temel Özellikler:
Global değişkenler kullanılarak threads::shared olmadan değişikliklerin diğer threadler tarafından görülmesi mümkün mü?
Hayır. Global değişkenler, her thread'e bireysel olarak kopyalanır. Değişim için yalnızca threads::shared veya diğer IPC kullanılır (işlemler arasında).
Bir Perl betiğinde fork ve thread başlatmak izinli mi?
Fork ve threadleri karıştırmak önerilmez, çünkü bu tahmin edilemeyen hatalara ve dengesiz bir davranışa yol açabilir. Perl, bu tekniklerin aynı anda kullanılmaması konusunda resmi olarak uyarıda bulunmaktadır.
Standart referanslar aracılığıyla karmaşık veri yapıları arasında veri aktarımı mümkün mü?
Hayır. Perl, iç içe yapıları otomatik olarak kopyalamaz ve bu tür girişimler hatalara veya sezgisel olmayan sonuçlara yol açar. Bunun için derin bir kopyalama ve paylaşılan kaynakların kullanımı gereklidir.
Geliştirici, threads::shared kullanmadan bir dizi üzerinden güncellenen basit bir kuyruk yarattı. Veri sık sık bozuldu ve programın işleyişinde yanlış sonuçlar ortaya çıktı.
Avantajlar:
Dezavantajlar:
Lock kullanarak threads::shared'in kullanılması, tüm kuyruğun paylaşılan olarak ilan edilmesini sağladı ve senkronizasyon lock aracılığıyla gerçekleşti. Program, yoğun yük altında bile stabil çalıştı.
Avantajlar:
Dezavantajlar: