Adakah yang bisa menyarankan proyek untuk saya tulis untuk membantu saya memahami threading

13

Saat ini saya adalah pengembang C # dengan pemahaman threading yang agak goyah.

Kedua tautan ini telah disarankan di pos lain:

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

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

Haruskah saya kembali ke dasar-dasar dan mungkin melihat beberapa teks ilmu komputer pada subjek?

Saya benar-benar merasa bahwa jika saya melompat dan menggunakan perpustakaan c # saya tidak akan benar-benar memiliki dasar pengetahuan yang kuat untuk dibangun. Saya pikir saya perlu mempelajari subjek ini dari awal seperti mahasiswa ilmu pengetahuan, lalu menggunakan perpustakaan C #.

Adakah yang bisa menyarankan pendekatan untuk belajar threading, mungkin beberapa tautan dan atau ide proyek?

Terima kasih sebelumnya!

Edit, terima kasih untuk semua balasan. Beberapa orang telah menyebutkan bahwa buku mungkin ide yang bagus, adakah yang bisa menyarankannya? Saya lebih suka bahasa agnostik. Adakah yang tahu kelas apa yang akan dicakup dalam gelar Ilmu Komputer ini? Saya mencoba ke google untuk beberapa catatan dan tugas online gratis.

bplus
sumber
Saya tidak tahu apakah ini membantu tetapi ini adalah tutorial sederhana yang saya tulis di VB.Net beberapa waktu lalu yang menjelaskan konsep dasar threading. Anda harus dapat mengonversinya menjadi C # dengan mudah. chrishaas.wordpress.com/2009/06/25/…
Chris Haas
Saya sangat tergoda untuk menyarankan menulis GUI multithreaded, dengan alasan bahwa itu akan mengajarkan batas-batas apa yang mungkin dilakukan dengan utas dan tetap waras. Tapi itu tidak konstruktif, jadi saya akan membiarkannya sebagai komentar, bukan jawaban ... :-)
Donal Fellows

Jawaban:

3

Tulis server web multi-utas. Anda akan belajar TON . Dan bukan hanya tentang threading.

GrandmasterB
sumber
4

Masalah produsen-konsumen adalah contoh klasik, dan ini membantu Anda untuk memahami tidak hanya threading, tetapi juga penjadwalan prosesor (dapat ditunjukkan menggunakan fork () untuk proses anak sebagai lawan utas) dan bagaimana program Anda berinteraksi dengan sistem operasi di belakang adegan.

Berikut ini ikhtisar hal-hal penting yang harus Anda pahami mengenai threading / forking 1. Bagaimana sistem operasi menjadwalkan tugas (misalnya algoritma round robin) 2. Penguncian Sumber Daya (Jika beberapa utas menggunakan sumber daya yang sama, Anda tidak ingin mereka melakukannya) mengaksesnya secara bersamaan - HAL-HAL BURUK TERJADI)

Inilah artikel wiki tentang masalah klasik ini: http://en.wikipedia.org/wiki/Producer-consumer_problem

Pada dasarnya, buat "Produser" yang menumbuhkan utas "Konsumen". Produser menghasilkan "sumber daya", dan konsumen mengkonsumsinya. Letakkan dalam satu lingkaran dan perhatikan apa yang terjadi (Anda akan terkejut bahwa pada akhirnya konsumen akan mengkonsumsi lebih banyak sumber daya kemudian tersedia karena metode yang tidak disinkronkan).


sumber
Menarik, sepertinya saya mengatur pola ini tanpa menyadarinya saat membuat layanan windows berulir. Deskripsi Anda sempurna. Bagus untuk diketahui, ini hampir akan ditandai sebagai jawaban atas pertanyaan terbuka saya.
Tony
2

Pilih salah satu masalah klasik yang sangat paralel. Anda mungkin merasa lebih menarik untuk memilih satu dengan speedup super-linear.

Pertimbangkan mencari melalui daftar yang tidak disortir dan tidak indeks. Masalah ini paralel paralel. Pertama mengimplementasikan pencarian berulir tunggal, kemudian pencarian paralel yang naif. Terapkan mencuri kerja. Hasilkan beberapa set data acak dan jalankan ketiga versi pada set data yang sama. Hitung speedup.

Ben Voigt
sumber
0

Saya tidak berpikir buku teks adalah langkah terbaik berikutnya. Sebuah proyek adalah jalan yang harus ditempuh. Itu harus menjadi sesuatu yang Anda sukai.

Pertama kali saya melakukan threading, saya meningkatkan kinerja crawler web. Anda dapat menjelajah jauh lebih cepat jika Anda tidak melakukan semua IO jaringan Anda secara serial. Ini adalah proyek yang bagus untuk memulai karena Anda dapat mendekatinya dengan beberapa cara, tetapi itu tidak serumit, katakanlah, pemrograman GUI multithreaded. Ini juga tidak memerlukan banyak keahlian khusus (misalnya, hal-hal komputasi yang berat).

Jadi, cari tahu beberapa info untuk mengikis dan mulai meretas. Seharusnya tidak butuh waktu lama bagi Anda untuk melakukan sesuatu, itu akan menjadi pengantar yang lembut.

Henry
sumber
Saya setuju dengan proyek, tetapi jaringan I / O bukan kasus penggunaan yang baik untuk utas. I / O non-blocking lebih efisien, menggunakan lebih sedikit sumber daya, dan menderita lebih sedikit kondisi balapan dan kasus sudut daripada masalah yang sama diselesaikan dengan utas. Bagian dari belajar untuk menjadi programmer paralel yang baik adalah mengenali ketika utas tidak ideal.
Ben Voigt
Anda mungkin benar, pengalaman yang saya maksudkan adalah beberapa pengikisan web Python yang sangat mendasar di mana saya menambahkan sekitar 8 baris kode untuk membuatnya multithreaded. Saya ragu akan semudah itu untuk melakukan async dengan kode yang ada, tetapi saya akan senang mengetahui jika / bagaimana saya salah. Saya pikir bagian dari belajar untuk menjadi programmer paralel yang baik mungkin memiliki banyak pengalaman, baik dan buruk :)
Henry
0

Memodelkan aplikasi Spy vs. Spy sederhana.

Setiap mata-mata berjalan pada utas terpisah.

Setiap mata-mata dapat menyebabkan kerusakan pada mata-mata lainnya, tetapi tidak secara langsung.

Setiap mata-mata dapat mencuri sumber daya berharga dari mata-mata lainnya, tetapi tidak secara langsung.

Kedua mata-mata ini memiliki sumber daya yang terbatas, dan harus membagikannya. Hanya satu mata-mata yang dapat menggunakan sumber daya yang diberikan pada suatu waktu.

Mike Hofer
sumber
0

Dari atas kepala saya: Edisi ke - 4 dari Buku Bruce Eckel "Thinking in Java" memiliki bab yang sangat panjang tentang threading (> 100 halaman - hampir sebuah buku kecil sendiri). Saya telah membaca edisi buku yang lebih lama, dan karenanya tidak membaca bab ini; tapi saya ingat salah satu posting blognya (atau catatan rilis bukunya), di mana ia mengklaim bahwa menulis ini sangat sulit dan pada akhirnya itu adalah prestasi nyata baginya. Coba lihat...

Selain itu, ada kursus video 2,5 jam di situs pelatihan komersial ini, tetapi Anda bisa mendapatkan uji coba gratis (harus meninggalkan data kartu kredit; jadi jangan lupa berhenti berlangganan)

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

knb
sumber
0

Haruskah saya kembali ke dasar-dasar dan mungkin melihat beberapa teks ilmu komputer pada subjek?

Itu selalu merupakan pilihan yang baik dan saya akan menyarankan Anda mengambil buku threading yang bagus untuk membiasakan diri Anda dengan threading. Saya belajar multithreading di Jawa dan pengetahuannya diterjemahkan dengan mudah ke dalam C #.

Jika Anda ingin contoh praktis, maka saya akan merekomendasikan Anda mencoba masalah filsuf makan .

Anda perlu mempelajari beberapa hal saat memasuki multithreading:

  1. Berbagai cara untuk menyinkronkan (semaphore, mutex, dll.)
  2. Operasi atom (dalam C # itu dilakukan melalui Interlocked untuk operasi yang bukan atom secara default).
  3. Pemrograman bersamaan tanpa kunci.
  4. Pemrograman bersamaan tanpa menunggu.
  5. Threads, ThreadPools, BackgroundWorkers, dll.

Saya tidak dapat memikirkan hal-hal lain saat ini. Tutorial Albahari terlihat sangat bagus!

Kiril
sumber
Sayangnya, filsuf makan bukanlah masalah yang berguna. Ini dimaksudkan untuk menjadi demonstrasi kondisi balapan, tetapi apakah kebuntuan yang sebenarnya terjadi adalah tunduk pada tingkah laku penjadwal sistem, tugas-tugas lain, gangguan hardware ... singkatnya itu sama sekali tidak deterministik, dan ini saya pikir itu bukan tempat yang baik untuk mulai belajar.
Ben Voigt
1
@Ben Voigt, saya setuju bahwa masalah filsuf makan adalah non-deterministik, tapi saya akan mengatakan bahwa mayoritas masalah threading juga tidak deterministik. Ketika saya mengambil kelas pemrograman bersamaan, itu adalah salah satu latihan pertama yang kami lakukan, sekarang saya tidak mengklaim bahwa guru itu benar, tetapi ia tentu saja adalah salah satu guru terbaik yang pernah saya miliki dan kemampuannya untuk menjelaskan dan mengajar. concurrency luar biasa. DPP menunjukkan hanya satu jenis masalah konkurensi: kebuntuan. OP juga harus melihat kondisi ras, masalah ABA, dan sebagainya.
Kiril
@ Lirik: Tentu, pahami masalah filsuf makan. Tetapi saya tidak akan mengimplementasikannya. Menulis kode yang salah bisa menjadi kebiasaan yang sulit untuk dihilangkan.
Ben Voigt
@ Ben Voigt, maaf, saya pasti kehilangan sesuatu: inti dari masalah para filsuf makan adalah menulis sebuah program yang tidak menemui jalan buntu, jadi bagaimana menyelesaikan DPP membutuhkan penulisan "kode yang salah"?
Kiril