Herkes benim için bir proje önermek için iş parçacığı anlamama yardımcı olabilir yazmak


13

Şu anda oldukça titrek bir iplik anlayışı ile bir C # geliştiricisi.

Bu bağlantıların her ikisi de diğer yayınlarda önerilmiştir:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

Temel konulara dönmeli ve belki de konuyla ilgili bazı bilgisayar bilimleri metinlerine bakmalı mıyım?

Gerçekten atlamak ve c # kitaplıkları kullanırsanız gerçekten sağlam bir bilgi temeli olmayacak hissediyorum. Sanırım bu konuyu sıfırdan bir com sci öğrencisi gibi öğrenmeli, sonra C # kütüphanelerini kullanmalıyım.

Herkes iplik öğrenme, belki bazı bağlantılar ve / veya proje fikirleri için bir yaklaşım önerebilir?

Şimdiden teşekkürler!

Düzenleyin, tüm cevaplar için teşekkürler. Bazı insanlar bir kitabın iyi bir fikir olabileceğini söylemişlerdir, birisi önerebilir mi? Agnostik bir dili tercih ederim. Bilgisayar Bilimi diplomasında bu dersin hangi sınıfta yer alacağını bilen var mı? Bazı ücretsiz çevrimiçi notlar ve ödevler için Google'ı kullanmaya çalışıyorum.


Bunun yardımcı olup olmadığını bilmiyorum ama bu, VB.Net'te bir süre önce yazdığım basit bir öğretici, temel diş açma kavramını açıklıyor. Kolayca C # dönüştürmek gerekir. chrishaas.wordpress.com/2009/06/25/…
Chris Haas

Çok iş parçacıklı bir GUI yazmayı, iş parçacıklarıyla yapmanın mümkün olduğunu ve aklı başında kalmanın sınırlarını öğreteceği gerekçesiyle şiddetle tavsiye ediyorum. Ama bu yapıcı olmazdı, bu yüzden bir cevap olarak değil, yorum olarak sürmesine izin vereceğim… :-)
Donal Fellows

Yanıtlar:


3

Çok iş parçacıklı bir web sunucusu yazın. Bir TON öğreneceksin . Ve sadece diş açmayla ilgili değil.


4

Üretici-tüketici sorunu klasik bir örnektir ve yalnızca iş parçacığı oluşturmayı değil, aynı zamanda işlemci zamanlamasını (iş parçacıklarının aksine alt süreçler için fork () kullanılarak gösterilebilir) ve programlarınızın arkadaki işletim sistemiyle nasıl etkileşimde bulunduğunu anlamanıza yardımcı olur. sahneler.

İşte, diş çekme / çatallama ile ilgili bilmeniz gereken önemli şeylerin bir özeti 1. İşletim sistemi görevleri nasıl zamanlar (örneğin yuvarlak robin algoritması) 2. Kaynak Kilitleme (Birden fazla iş parçacığı aynı kaynağı kullanıyorsa, bunları istemezsiniz) onlara aynı anda erişiyor - KÖTÜ ŞEYLER MUTLU)

İşte bu klasik problemle ilgili bir wiki makalesi: http://en.wikipedia.org/wiki/Producer-consumer_problem

Temel olarak, "Tüketiciler" iş parçacığı üreten bir "Üretici" oluşturun. Üretici bir "kaynak" üretir ve tüketiciler bunu tüketir. Bir döngüye koyun ve ne olduğunu izleyin (sonuçta tüketicilerin senkronize olmayan yöntemler nedeniyle daha fazla kaynak tüketeceğine şaşıracaksınız).


İlginç, ben bu desen bir dişli windows hizmeti oluştururken fark etmeden kurmak gibi görünüyor. Açıklamanız mükemmeldi. Bilmek güzel, bu neredeyse açık sorumun cevabı olarak işaretlenirdi.
Tony,

2

Klasik oldukça paralel problemlerden birini seçin. Süper doğrusal hıza sahip bir tane seçmek daha ilginç olabilir.

Sıralanmamış ve dizinsiz bir listede arama yapmayı düşünün. Bu sorun son derece paraleldir. Önce tek iş parçacıklı bir arama, daha sonra saf bir paralel arama uygulayın. İş çalma uygulayın. Bazı rastgele veri kümeleri oluşturun ve üç sürümü de aynı veri kümelerinde çalıştırın. Hızlandırmayı hesaplayın.


0

Bir ders kitabının bir sonraki en iyi adım olduğunu sanmıyorum. Bir proje gitmenin yoludur. Heyecanlandığınız bir şey olmalı.

İlk kez diş açarken bir web tarayıcısının performansını artırıyordum. Tüm ağ IO'nuzu seri olarak yapmıyorsanız çok daha hızlı tarayabilirsiniz. Bu, başlamak için harika bir projedir çünkü ona birkaç şekilde yaklaşabilirsiniz, ancak çok iş parçacıklı GUI programlama kadar karmaşık değildir. Ayrıca çok fazla uzmanlık becerisi gerektirmez (örneğin, ağır hesaplamalı şeyler).

Yani, kazıma ve hacklemeye başlamak için bazı bilgiler bul. Bir şeyin devam etmesi uzun sürmemeli, nazik bir giriş olacaktır.


Bir projeye katılıyorum, ancak ağ G / Ç iş parçacıkları için iyi bir kullanım durumu değildir. Tıkanmasız I / O daha verimlidir, daha az kaynak kullanır ve daha az yarış durumu ve köşe durumu ile aynı sorunlardan çözülür. İyi bir paralel programcı olmayı öğrenmenin bir kısmı, iş parçacıklarının ideal olmadığının farkındadır.
Ben Voigt

Çok iyi olabilirsiniz, bahsettiğim deneyim, çok iş parçacıklı hale getirmek için yaklaşık 8 satır kod eklediğim bazı çok temel Python web kazıma oldu. Mevcut kod ile async yapmak o kadar kolay olurdu şüpheliyim, ama ben / nasıl yanlış olduğunu bilmek isterim. Bence iyi bir paralel programcı olmayı öğrenmenin bir kısmı, kemerinizin altında iyi ve kötü bir sürü deneyime sahip olmak olabilir :)
Henry

0

Basit bir Casus ve Casus uygulamasını modelleyin.

Her casus ayrı bir iş parçacığında çalışır.

Her bir casus diğer casuslara zarar verebilir, ama doğrudan değil.

Her casus, diğer casuslardan değerli kaynakları çalabilir, ama doğrudan değil.

Her iki casusun da sınırlı bir kaynak havuzu vardır ve bunları paylaşmak zorundadırlar. Belirli bir kaynağı aynı anda yalnızca bir casus kullanabilir.


0

Kafamın üstünde: Bruce Eckel'in "Java'da Düşünme" Kitabının 4. Basımının diş açma hakkında çok uzun bir bölümü var (> 100 sayfa - kendi içinde neredeyse küçük bir kitap). Kitabın eski baskılarını okudum ve bu yüzden bu bölümü okumadım; ancak blog yazılarından birini (veya kitabının yayın notlarını) hatırlıyorum, burada yazmanın çok zor olduğunu ve sonunda onun için gerçek bir başarı olduğunu iddia ediyor. Bunu kontrol et...

Bunun yanı sıra, bu ticari eğitim sitesinde 2,5 saatlik bir video kursu var, ancak ücretsiz deneme sürümü alabilirsiniz (kredi kartı verilerini bırakmanız gerekir; bu yüzden aboneliği iptal etmeyi unutmayın)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

Temel konulara dönmeli ve belki de konuyla ilgili bazı bilgisayar bilimleri metinlerine bakmalı mıyım?

Bu her zaman iyi bir seçimdir ve iş parçacığını tanımak için iyi bir iş parçacığı kitabı almanızı tavsiye ederim. Java ile multithreading öğrendim ve bilgi kolayca C # tercüme.

Pratik bir örnek istiyorsanız, yemek filozofu problemini denemenizi tavsiye ederim .

Birden çok iş parçacığına girerken birkaç şey öğrenmeniz gerekir:

  1. Senkronize etmenin farklı yolları (semafor, muteks vb.)
  2. Atomik işlemler (C # 'da, varsayılan olarak atomik olmayan işlemler için Interlocked üzerinden yapılır).
  3. Kilitsiz eşzamanlı programlama.
  4. Beklemesiz eşzamanlı programlama.
  5. Konular, ThreadPools, BackgroundWorkers vb.

Şu anda başka şeyler düşünemiyorum. Albahari öğreticisi gerçekten iyi görünüyor!


Ne yazık ki, yemek felsefecileri yararlı bir sorun değildir. Yarış koşullarının bir gösterimi olması amaçlanıyor, ancak kilitlenmenin gerçekten meydana gelip gelmediği sistem zamanlayıcısının, diğer görevlerin, donanım kesmelerinin tabiatına tabi ... kısaca tamamen belirsizdir ve bu bence bu iyi bir yer değil öğrenmeye başla.
Ben Voigt

1
@Ben Voigt, yemek felsefecileri sorununun deterministik olmadığını kabul ediyorum, ancak diş çekme sorunlarının çoğunun da deterministik olmadığını söyleyebilirim. Eşzamanlı bir programlama dersi aldığımda yaptığımız ilk egzersizlerden biriydi, şimdi öğretmenin mutlaka haklı olduğunu iddia etmiyorum, ama kesinlikle sahip olduğum en iyi öğretmenlerden biriydi ve açıklama ve öğretme yeteneğiydi. eşzamanlılık mükemmeldi. DPP yalnızca bir tür eşzamanlılık sorunu gösterir: kilitlenme. OP ayrıca yarış koşullarına, ABA problemine vb. De bakmalıdır.
Kiril

@Lirik: Elbette, yemek felsefecileri sorununu anlayın. Ama ben uygulamayacağım. Yanlış kod yazmak zor bir alışkanlık haline gelebilir.
Ben Voigt

@Ben Voigt, üzgünüm, bir şey eksik gerekir: yemek filozofları sorunun noktası bir program yazmaktır değil kilitlenmeye, bu yüzden nasıl DPP "yanlış kod" yazımı gerektiren çözme ki?
Kiril
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.