SORU
24 HAZİRAN 2010, PERŞEMBE


Neden konuları açık bir yönetim kötü bir şey mi?

a previous question, bir gaf bir parça yaptım. Sen konuları hakkında okuma oldum ve kivi jölesi beri lezzetli şeyler olduğu izlenimi var.

Şeyler okuduğumda şaşkınlığımı o zaman hayal gibi:

[T]hreads Çok Kötü Bir Şey. Veya, en azından, konuları açık bir yönetim kötü bir şey

ve

İş parçacıkları arasında UI Güncelleştirme genellikle iş parçacığı kötüye bir işarettir.

Bir köpek her zaman öldürürüm beri bir şey kafamı karıştırdı, bunu bir şans olarak gör karman düze

Nasıl iplik kullanarak olmalıdır?

CEVAP
24 HAZİRAN 2010, PERŞEMBE


İş parçacığı büyük olduğunu öğrenmek için; Enthusiam beni yanlış anlamayın. Coşku içinçok sayıda iş parçacığı kullanarakbuna karşılık, İplik Mutluluk Hastalığı dediğimiz bir belirtisi.

Sadece iş gücü "ne kadar çok iş parçacığı olası bir programla oluşturabilirim?" gibi sorular sormaya başlar öğrendi geliştiriciler Bu İngilizce önemli bir sormak gibi "kaç kelime bir cümle içinde kullanabilir miyim?" yerine Yazarlar için tipik bir tavsiye cümlelerini kısa tutmak ve mümkün olduğunca tek bir cümle içine nokta, birçok sözler ve fikirler olarak tıkmak için çalışıyor yerine. Konuları aynı şekilde; doğru soru şudur: "kaç oluşturma ile dışarıda" değil, "nasıl iş parçacığı sayısı böylece bu program yazabilirim . miyim? ^em>minimumgerekli işi?"

İş parçacığı bir sürü sorunu çözmek, doğru, ama onlar da büyük sorunlar tanıtmak:

  • Çok parçacıklı programlar performans analizi çoğu son derece zor ve derin mantığa aykırı. Ağır gerçek dünya örnekleri içinde daha hızlı bir işlev yapmak çok parçacıklı programlar gördümbaşka bir işlevi yavaşlatan ya da daha fazla bellek kullanmadankılan sistem toplam işlem hacmidaha küçük. Neden? Konuları genellikle sokaklarda şehir gibi çünkü. Hayal her sokak alınması ve sihirli bir şekilde daha kısa yapmayeniden zamanlama trafik ışıkları olmadan. Trafik sıkışıklığı daha iyi, ya da kötü olsun ki? Çok parçacıklı programlar daha hızlı yazma fonksiyonlarısürücüler trafik sıkışıklığı doğru işlemci daha hızlı.

İstediğin konuları ınterstate Karayolları gibi olacaktır: hiçbir trafik ışıkları, son derece paralel, az sayıda en çok kesişen iyi tanımlanmış, dikkatle tasarlanmış işaret eder.Bunu yapmak çok zordur.En çok çok parçacıklı programlar gibi trafik ışıkları ile kentsel çekirdek her yerde yoğun.

  • Konuları kendi özel yönetimi yazılı delicesine genellikle zordur. Bu nedenle iyi tasarlanmış bir program tek dişli düzenli bir program, "genel durumu hakkında neden var" genellikle küçük. miktarını yazarken çünkü. İdeal olarak iyi tanımlanmış üyeleri çağıran denetim akışı umurumda değil sınırları ve nesneleri yazıyorsun. Bir döngü, ya da bir anahtar, bir nesne çağırmak isterseniz, ya da her neyse, hiç durma.

Çok dişli, özel dişli programları yönetimi gerektirirglobalanlayışher şeyibir mesaj olacak bumuhtemelenbaşka bir iş parçacığı görünür verileri etkiler. Hemen hemen kafandaki tüm program ve anlamak zorundatümdoğru ve kilitlenmeleri veya veri bozulmasını önlemek için iki iş parçacığı sipariş etkileşim içinde olabilecek olası yolları. Bu para için büyük bir maliyet ve hataları eğilimli.

  • Esasen, konuları yöntemleriniyalan. Sana bir örnek vereyim. Olduğunu varsayalım:

    (eğer!sıra.Isempty) sıra.() RemoveWorkİtem.() Yürütmek;

Bu kod doğru mu? Eğer tek dişli ise, muhtemelen. Eğer çok kanallı, ne kalan son item değiştirmekten başka bir iş parçacığı durdurmaksonraIsEmpty çağrısı yürütülür? Hiçbir şey, işte budur. Yerel olarak gayet iyi görünüyor bu kod, bomba atılmış, bir çok iş parçacıklı programı gitmek için bekliyor. Temel olarak bu kod aslında

 if (queue.WasNotEmptyAtSomePointInThePast) ...

belli ki oldukça işe yaramaz.

Yani sıra kilitleme sorunu çözmek için karar varsayalım. Bu doğru mu?

lock(queue) {if (!queue.IsEmpty) queue.RemoveWorkItem().Execute(); }

Böyle de değildi, mutlaka. Yürütme neden olur ne bir kaynak şu anda başka bir iş parçacığı tarafından kilitlendi bekler, ama iş parçacığı sıra kilit için bekleyen çalıştırmak için kod sanırım? Her iki iş sonsuza kadar bekleyin. Kod parçası etrafında bir kilit koyarak bilmek gerekirher şeyibu kod olabilirmuhtemelenherhangi birherhangi bir kilitlenme olup olmayacağını anlayabilir misin paylaşılan kaynak. Yine, birisi çok basit bir kod olmalı yazı koymak için son derece ağır bir yüktür. (Burada yapılacak en doğru şey muhtemelen kilit işe maddenin özü ve kilit dışında sonra çalıştırmaktır. Öğeleri belirli bir sırada çalıştırılacak çünkü Sırada ne varsa ama...? Şimdi bu kodu başka bir iş parçacığı daha sonra ilk işleri yürütmek çok yanlış olduğu için.)

  • Daha da kötüye gidiyor. C# dili spec tek iş parçacıklı bir program program listesi gibi tam olarak gözlemlenebilir davranış olduğunu garanti eder. Eğer "if (M(ref x)) b = 10; kodu oluşturulan x M tarafından erişilen gibi davranmaya biliyorsun o zaman" gibi bir şey varsa, ^em>önceb yazılır. Şimdi, derleyici, titreme ve CPU en iyi duruma getirmek için ücretsiz. Eğer onlardan biri olabilir belirleyen M olacak doğru mu? ve biliyoruz ki bu iş parçacığı, b değeri değildir okuduktan sonra çağrı M, b atanabilen önce x erişilen. Garantili tek iş parçacıklı programıbu gibi iş gibi görünüyor yazılmıştır.

Çok parçacıklı programlardeğilgaranti olun. B inceleniyor ve bu bir süre farklı bir iş parçacığı x sonra çalışıyorolabilirx önce b değiştirirseniz optimizasyon gerçekleştirilirse erişilir.Mantıksal olarak ileriye ve geriye tek dişli programları birbirine saygı ile zaman içinde hareket ettirilebilir okuma ve yazma, ve bu hareketleri çok parçacıklı programlar görülebilir.

Bunun için yazmak çok parçacıklı programlar nerede bir bağımlılık, mantığa şeyler gözlenen başına aynı sipariş kodu aslında yazılı, zorundasınayrıntılıbu anlayış "bellek modeli" Dil ve çalışma zamanı. Erişir etrafında hareket nasıl garanti hakkında yapılan tam olarak bilmek zorundasın. Ve sadece 86 kutusu ve umudun üzerinde test iyisi olamaz; 86 cips dışarıda başka cips kıyasla oldukça muhafazakar iyileştirmeler var.

Kendi çok iş parçacıklı mantığınız yazarken sadece karşılaştığınız sorunları sadece bir kaç kısa bir bakış. Daha bir sürü var. Bu yüzden, bazı tavsiyeler:

  • İş parçacığı oluşturma hakkında bilgi edinin.
  • Üretim kodu kendi iş parçacığı yönetimi yazmak için çalışmayın.
  • Üst düzey kütüphaneler uzmanlar tarafından yazılmış konuları ile ilgili sorunları çözmek için kullanın. Eğer arka planda yapılması ve işçi iş parçacığı için dışarı çiftlik yapmak isteyen bir sürü iş varsa, kendi iş parçacığı oluşturma mantığını yazmak yerine bir iş parçacığı havuzu kullanın. Eğer birden fazla İŞLEMCİ aynı anda çözüm için müsait bir sorununuz varsa, Görev Paralel Kitaplığı kullanın. Eğer tembel bir kaynak başlatmak istiyorsanız, kilidi serbest kod yazmak yerine geç başlatma sınıfını kullanın kendinizi.
  • Paylaşılan durum kaçının.
  • Eğer paylaşılan bir durum önleyebilirsiniz mi, değişmez devlet payı.
  • Eğer değişken paylaşım durumu varsa, kilidi serbest teknikleri kilitleri kullanmayı tercih.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • GALERNAYA20

    GALERNAYA20

    19 NİSAN 2011
  • MarinaHD2001

    MarinaHD2001

    7 ŞUBAT 2009