ใครช่วยแนะนำโครงการสำหรับฉันเขียนเพื่อช่วยให้ฉันเข้าใจเธรด


13

ตอนนี้ฉันเป็นนักพัฒนา C # ด้วยความเข้าใจที่สั่นคลอนของการทำเกลียว

ลิงก์ทั้งสองนี้ได้รับการแนะนำในโพสต์อื่น ๆ :

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

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

ฉันควรกลับไปสู่พื้นฐานและอาจดูตำราวิทยาการคอมพิวเตอร์บางเรื่องในเรื่องนี้หรือไม่?

ฉันรู้สึกว่าถ้าฉันกระโดดเข้ามาและใช้ห้องสมุด c # ฉันจะไม่มีพื้นฐานความรู้ที่แข็งแกร่งในการสร้าง ฉันคิดว่าฉันต้องเรียนรู้เรื่องนี้ตั้งแต่เริ่มต้นเหมือนนักเรียน com sci จากนั้นใช้ห้องสมุด C #

ทุกคนสามารถแนะนำวิธีการเรียนรู้การทำเกลียวบางทีอาจจะมีลิงค์และหรือความคิดโครงงานบ้าง

ขอบคุณล่วงหน้า!

แก้ไขขอบคุณสำหรับคำตอบทั้งหมด บางคนกล่าวว่าหนังสืออาจเป็นความคิดที่ดีใคร ๆ ก็สามารถแนะนำได้บ้าง ฉันชอบภาษาที่ไม่เชื่อเรื่องพระเจ้า ไม่มีใครรู้ว่าสิ่งที่ชั้นนี้จะครอบคลุมในการศึกษาระดับปริญญาวิทยาศาสตร์คอมพิวเตอร์? ฉันพยายาม google เพื่อรับโน้ตและการบ้านออนไลน์ฟรี


ฉันไม่รู้ว่านี่จะช่วยได้หรือไม่ แต่นี่เป็นแบบฝึกหัดง่ายๆที่ฉันเขียนใน VB.Net ในขณะที่อธิบายแนวคิดพื้นฐานของเธรด คุณควรจะแปลงเป็น C # ได้อย่างง่ายดาย chrishaas.wordpress.com/2009/06/25/…
Chris Haas

ฉันอยากจะแนะนำให้เขียน GUI แบบมัลติเธรดเพราะมันจะสอนขีด จำกัด ของสิ่งที่เป็นไปได้ที่จะทำกับเธรดและยังคงมีสติอยู่ แต่นั่นจะไม่สร้างสรรค์ดังนั้นฉันจะปล่อยให้มันเป็นความคิดเห็นไม่ใช่คำตอบ… :-)
Donal Fellows

คำตอบ:


3

เขียนเว็บเซิร์ฟเวอร์แบบมัลติเธรด คุณจะได้เรียนรู้TON และไม่เพียงเกี่ยวกับการทำเกลียว


4

ปัญหาโปรดิวเซอร์และผู้บริโภคเป็นตัวอย่างที่คลาสสิกและช่วยให้คุณเข้าใจไม่เพียง แต่เธรดเท่านั้น แต่การกำหนดเวลาตัวประมวลผล (สามารถแสดงให้เห็นได้โดยใช้ fork () สำหรับกระบวนการลูกซึ่งแตกต่างจากเธรด) และวิธีที่โปรแกรมของคุณโต้ตอบกับระบบปฏิบัติการ ฉาก

ต่อไปนี้เป็นบทสรุปของสิ่งสำคัญที่คุณควรเข้าใจเกี่ยวกับเธรด / ฟอร์กกิ้ง 1. ระบบปฏิบัติการจัดตารางงาน (อัลกอริธึมรอบโรบินเช่น) 2. การล็อกทรัพยากร (ถ้าหลายเธรดใช้ทรัพยากรเดียวกันคุณไม่ต้องการให้ สามารถเข้าถึงได้ในเวลาเดียวกัน - สิ่งที่ไม่ดีเกิดขึ้น)

นี่คือบทความวิกิเกี่ยวกับปัญหาคลาสสิคนี้: http://en.wikipedia.org/wiki/Producer-consumer_problem

โดยทั่วไปให้สร้าง "Producer" ที่วางไข่เธรดของ "Consumer" ผู้ผลิตสร้าง "ทรัพยากร" และผู้บริโภคบริโภคมัน ใส่ไว้ในลูปและดูว่าเกิดอะไรขึ้น (คุณจะประหลาดใจว่าในที่สุดผู้บริโภคจะใช้ทรัพยากรมากขึ้นก็จะพร้อมใช้งานเนื่องจากวิธีการไม่ซิงโครไนซ์)


น่าสนใจดูเหมือนว่าฉันติดตั้งรูปแบบนี้โดยไม่ทราบว่ามันเกิดขึ้นในขณะที่สร้างบริการ windows แบบเธรด คำอธิบายของคุณสมบูรณ์แบบ เป็นการดีที่จะรู้ว่านี่จะถูกทำเครื่องหมายเป็นคำตอบสำหรับคำถามเปิดของฉัน
Tony

2

เลือกหนึ่งในปัญหาที่ขนานกันอย่างคลาสสิก คุณอาจพบว่ามันน่าสนใจมากที่จะเลือกใช้การเร่งความเร็วแบบ Super-Linear

พิจารณาการค้นหาผ่านรายการที่ไม่เรียงลำดับและไม่ได้จัดทำดัชนี ปัญหานี้ขนานกันเล็กน้อย ก่อนอื่นให้ทำการค้นหาแบบเธรดเดียวจากนั้นทำการค้นหาแบบขนานที่ไร้เดียงสา ใช้การขโมยงาน สร้างชุดข้อมูลสุ่มและเรียกใช้ทั้งสามรุ่นในชุดข้อมูลเดียวกัน คำนวณความเร็ว


0

ฉันไม่คิดว่าหนังสือเรียนเป็นขั้นตอนต่อไปที่ดีที่สุด โครงการคือหนทางที่จะไป มันควรเป็นสิ่งที่คุณตื่นเต้น

ครั้งแรกที่ฉันทำเกลียวฉันได้ปรับปรุงประสิทธิภาพของโปรแกรมรวบรวมข้อมูลเว็บ คุณสามารถรวบรวมข้อมูลได้เร็วขึ้นมากหากคุณไม่ได้ทำ IO เครือข่ายทั้งหมดของคุณในแบบอนุกรม นี่เป็นโครงการที่ยอดเยี่ยมในการเริ่มต้นเพราะคุณสามารถเข้าใกล้มันได้หลายวิธี แต่มันก็ไม่ได้ซับซ้อนเหมือนการเขียนโปรแกรมการเขียน GUI แบบมัลติเธรด นอกจากนี้ยังไม่ต้องการทักษะเฉพาะทางมากนัก (ตัวอย่างเช่นการคำนวณที่หนักหน่วง)

ดังนั้นให้คิดข้อมูลเพื่อขูดและเริ่มแฮ็ค ไม่ควรใช้เวลานานกว่าจะได้อะไรซักอย่างมันจะเป็นการแนะนำตัวที่อ่อนโยน


ฉันเห็นด้วยกับโครงการ แต่เครือข่าย I / O ไม่ใช่กรณีการใช้งานที่ดีสำหรับเธรด การไม่บล็อก I / O นั้นมีประสิทธิภาพมากกว่าใช้ทรัพยากรน้อยกว่าและทนทุกข์ทรมานจากสภาพการแข่งขันและกรณีมุมน้อยกว่าปัญหาเดียวกันที่แก้ไขด้วยเธรด ส่วนหนึ่งของการเรียนรู้ที่จะเป็นโปรแกรมเมอร์คู่ขนานที่ดีคือการจดจำเมื่อเธรดไม่เหมาะ
Ben Voigt

คุณอาจพูดถูกแล้วประสบการณ์ที่ฉันพูดถึงก็คือการคัดลอกเว็บไพ ธ อนพื้นฐานที่ฉันเพิ่มโค้ดประมาณ 8 บรรทัดเพื่อให้เป็นแบบมัลติเธรด ฉันสงสัยว่ามันจะเป็นเรื่องง่ายที่จะทำ async กับรหัสที่มีอยู่ แต่ฉันชอบที่จะรู้ว่า / ฉันผิด ผมคิดว่าส่วนหนึ่งของการเรียนรู้ที่จะเป็นโปรแกรมเมอร์ที่ดีขนานอาจจะมีจำนวนมากประสบการณ์ภายใต้เข็มขัดของคุณดีและไม่ดี :)
เฮนรี่

0

สร้างแบบจำลองแอป Spy vs. Spy ที่เรียบง่าย

สายลับแต่ละตัวจะวิ่งแยกกัน

สายลับแต่ละคนสามารถสร้างความเสียหายกับสายลับอื่น ๆ แต่ไม่โดยตรง

สายลับแต่ละคนสามารถขโมยทรัพยากรที่มีค่าจากสายลับอื่นได้ แต่ไม่ใช่โดยตรง

สายลับทั้งสองมีทรัพยากร จำกัด ในการกำจัดและต้องแบ่งใช้ สายลับเพียงหนึ่งคนเท่านั้นที่สามารถใช้ทรัพยากรที่ได้รับในแต่ละครั้ง


0

ด้านบนของหัวของฉัน: หนังสือเล่มที่4ของ Bruce Eckel "การคิดใน Java"มีบทที่ยาวมากในการทำเกลียว (> 100 หน้า - เกือบเล่มเล็ก ๆ ในตัวเอง) ฉันได้อ่านหนังสือรุ่นเก่ากว่าและไม่ได้อ่านบทนี้ แต่ฉันจำหนึ่งในบล็อกโพสต์ของเขา (หรือบันทึกประจำรุ่นของหนังสือของเขา) ซึ่งเขาอ้างว่าการเขียนนี้ยากมากและในที่สุดมันก็เป็นความสำเร็จที่แท้จริงสำหรับเขา ลองดูสิ ...

นอกเหนือจากนี้ยังมีหลักสูตรวิดีโอ 2.5 ชั่วโมงในเว็บไซต์ฝึกอบรมเชิงพาณิชย์นี้ แต่คุณสามารถทดลองใช้ฟรี (ต้องออกจากข้อมูลบัตรเครดิตดังนั้นอย่าลืมยกเลิกการสมัคร)

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


0

ฉันควรกลับไปสู่พื้นฐานและอาจดูตำราวิทยาการคอมพิวเตอร์บางเรื่องในเรื่องนี้หรือไม่?

นั่นเป็นตัวเลือกที่ดีเสมอและฉันขอแนะนำให้คุณรับสมุดเธรดที่ดีเพื่อทำความคุ้นเคยกับการทำเกลียว ฉันเรียนรู้การทำงานหลายเธรดใน Java และความรู้ที่ได้รับการแปลเป็นภาษา C # ได้อย่างง่ายดาย

หากคุณต้องการตัวอย่างในทางปฏิบัติแล้วฉันจะแนะนำให้คุณลองปัญหาปรัชญาการรับประทานอาหาร

คุณต้องเรียนรู้หลายสิ่งหลายอย่างเมื่อคุณเข้าสู่มัลติเธรด:

  1. วิธีต่างๆในการซิงโครไนซ์ (เซมาฟอร์, mutex, ฯลฯ )
  2. การทำงานของ Atomic (ใน C # ทำได้ผ่าน Interlocked สำหรับการดำเนินการที่ไม่ใช่ Atomic ตามค่าเริ่มต้น)
  3. การเขียนโปรแกรมพร้อมกันล็อคฟรี
  4. การเขียนโปรแกรมพร้อมกันโดยไม่ต้องรอ
  5. เธรด, ThreadPools, BackgroundWorkers ฯลฯ

ฉันไม่สามารถคิดสิ่งอื่น ๆ ได้ในขณะนี้ บทช่วยสอน Albahari ดูดีจริงๆ!


น่าเสียดายที่นักปรัชญาการกินไม่ใช่ปัญหาที่มีประโยชน์ มันตั้งใจที่จะแสดงให้เห็นถึงสภาพการแข่งขัน แต่ไม่ว่าจะเกิดการชะงักงันจริงหรือไม่นั้นขึ้นอยู่กับความหลากหลายของกำหนดการระบบงานอื่น ๆ การขัดจังหวะของฮาร์ดแวร์ เริ่มเรียนรู้
Ben Voigt

1
@Ben Voigt ฉันจะยอมรับว่าปัญหานักปรัชญาการรับประทานอาหารไม่ได้กำหนด แต่ฉันบอกว่าปัญหาเกลียวส่วนใหญ่ไม่ได้กำหนดขึ้นเช่นกัน เมื่อฉันเข้าคลาสการเขียนโปรแกรมพร้อมกันมันเป็นหนึ่งในแบบฝึกหัดแรกที่เราทำตอนนี้ฉันไม่ได้อ้างว่าครูถูกต้อง แต่เขาก็เป็นหนึ่งในครูที่ดีที่สุดที่ฉันเคยมีและความสามารถของเขาในการอธิบายและสอน เห็นพ้องด้วยเป็นเลิศ DPP แสดงปัญหาการเกิดพร้อมกันเพียงประเภทเดียว: การหยุดชะงัก OP ควรพิจารณาถึงสภาพการแข่งขันปัญหา ABA และอื่น ๆ
คิริล

@Lirik: แน่นอนเข้าใจปัญหานักปรัชญาการรับประทานอาหาร แต่ฉันจะไม่ใช้มัน การเขียนรหัสผิดอาจกลายเป็นนิสัยที่ยากที่จะทำลายได้
Ben Voigt

@Ben Voigt ขอโทษฉันต้องหายไปบางสิ่งบางอย่าง: ปัญหาของนักปรัชญาการรับประทานอาหารคือการเขียนโปรแกรมที่ไม่หยุดชะงักดังนั้นการแก้ DPP จะต้องเขียน "รหัสผิด" อย่างไร
คิริล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.