กลุ่มเธรดคืออะไร


62

หนึ่งจะใช้ threadpool ได้อย่างไร ฉันได้อ่านวิกิพีเดียเกี่ยวกับ "threadpool" แต่ฉันก็ยังไม่สามารถคิดได้ว่าสิ่งใดที่ควรทำเพื่อแก้ปัญหานี้

ใครช่วยอธิบายฉันเป็นภาษาอังกฤษธรรมดาว่า threadpool คืออะไรและใครจะตอบคำถามนี้ได้บ้าง?

คำตอบ:


96

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

การปรับใช้จะแตกต่างกันตามสภาพแวดล้อม แต่ในแง่ง่ายคุณต้องมีสิ่งต่อไปนี้:

  • วิธีสร้างเธรดและเก็บไว้ในสถานะว่าง สิ่งนี้สามารถทำได้โดยให้แต่ละเธรดรอที่สิ่งกีดขวางจนกว่าสระมือจะทำงาน (สามารถทำได้ด้วย mutexes เช่นกัน)
  • คอนเทนเนอร์เพื่อจัดเก็บเธรดที่สร้างขึ้นเช่นคิวหรือโครงสร้างอื่น ๆ ที่มีวิธีเพิ่มเธรดลงในพูลและดึงออกหนึ่งรายการ
  • อินเตอร์เฟสมาตรฐานหรือคลาส abstract สำหรับเธรดที่ใช้ในการทำงาน นี้อาจจะมีระดับนามธรรมที่เรียกว่าTaskกับexecute()วิธีการที่จะทำงานแล้วผลตอบแทน

เมื่อสร้างเธรดพูลเธรดจะสร้างอินสแตนซ์ของเธรดจำนวนหนึ่งเพื่อให้พร้อมใช้งานหรือสร้างเธรดใหม่ตามต้องการขึ้นอยู่กับความต้องการของการนำไปใช้

เมื่อส่งมอบพูล a Taskจะใช้เธรดจากคอนเทนเนอร์ (หรือรอให้มีพูลว่างหากคอนเทนเนอร์ว่าง) ส่ง a Taskและตรงกับสิ่งกีดขวาง สิ่งนี้ทำให้เธรดที่ไม่ได้ทำงานดำเนินการต่อโดยเรียกใช้execute()เมธอดที่Taskได้รับ เมื่อการดำเนินการเสร็จสิ้นเธรดจะส่งกลับไปยังพูลเพื่อนำไปใช้ในคอนเทนเนอร์อีกครั้งเพื่อใช้งานอีกครั้งจากนั้นเข้าสู่สิ่งกีดขวางทำให้ตัวเองเข้าสู่โหมดสลีจนกระทั่งวงจรซ้ำ


19
กลุ่มเธรดคือกลุ่มของเธรดที่ไม่ได้ใช้งานล่วงหน้าซึ่งพร้อมใช้งาน [... ] วิธีนี้ช่วยป้องกันไม่ให้เกิดค่าใช้จ่ายในการสร้างเธรดเป็นจำนวนมาก - สิ่งนี้ควรเป็นของ Google เมื่อใดก็ตามที่มีคนค้นหา "กลุ่มเธรด"
Rafael Eyng

ไม่ ว่ายน้ำในหัวข้อการสร้างที่เกี่ยวข้องกับอุปสรรคภายใน? คุณสามารถแบ่งปันการอ้างอิงในบรรทัดเหล่านี้ได้หรือไม่?
แลกเปลี่ยนที่มากเกินไป

@overexchange ไม่มันไม่ได้ การอ้างอิงของฉันกับคำถามนี้ก็เป็นตัวอย่างของวิธีที่ดีกว่าที่จะกลับมาเขียนคำถามอุปสรรคของคุณ (ถ้าคุณทำฉันจะเขียนคำตอบ)
Blrfl

หนึ่งในคำตอบสั้น ๆ ที่ดีที่สุด
Blood-HaZaRd

10

เธรดพูลคือชุดของเธรดที่ได้รับการจัดการซึ่งมักจะจัดระเบียบในคิวซึ่งดำเนินการงานในคิวงาน

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

กลุ่มเธรดช่วยให้คุณหลีกเลี่ยงการสร้างหรือทำลายเธรดมากกว่าที่จำเป็นจริงๆ

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


1

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


1

ตัวอย่างชีวิตจริง;

  1. สิ่งอำนวยความสะดวก: ระบบปฏิบัติการ
  2. ส่วน: การใช้งาน
  3. คน: หัวข้อ

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

หากคุณใช้การรวมเธรดแล้วในตอนเช้าคุณจะกำหนดให้ 6 คนเข้าครัว 2 คนเข้าห้องน้ำ 2 คนและ 4 คนเพื่อความปลอดภัย ดังนั้นพวกเขาจะทำการเตรียมตัวเพียงครั้งเดียวในหนึ่งวัน แม้ว่าจะไม่มีลูกค้าอยู่ในครัวคนทั้ง 4 คนก็จะอยู่เฉยๆสำหรับงานที่กำลังจะเกิดขึ้น พวกเขาไม่จำเป็นต้องกลับไปที่ห้องประชุมจนกว่าครัวจะปิดลง 4 คนนี้อยู่ในแอพ Kitchen และพร้อมที่จะให้บริการอย่างรวดเร็ว แต่คุณไม่สามารถสัญญาว่าพวกเขาจะทำงานได้ตลอดทั้งวันเนื่องจากห้องครัวอาจกลายเป็นเวลาว่าง ใช้ตรรกะเดียวกันสำหรับห้องน้ำและความปลอดภัยเช่นกัน

ในสถานการณ์แรกคุณไม่ต้องเสียเธรดใด ๆ สำหรับงานใด ๆ แต่จะใช้เวลาในการเตรียมเธรดเดี่ยวสำหรับงานแต่ละงาน ในครั้งที่สองคุณเตรียมหัวข้อล่วงหน้าดังนั้นคุณจึงไม่สามารถรับประกันได้ว่าคุณจะใช้เธรดทั้งหมดสำหรับงานทั้งหมด แต่ระบบปฏิบัติการส่วนใหญ่จะทำการปรับให้เหมาะสมอย่างมากเพื่อให้คุณสามารถวางใจได้

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