ฉันกำลังทำงานกับแอพพลิเคชั่นที่เล่นดนตรี
ในระหว่างการเล่นบ่อยครั้งสิ่งต่าง ๆ ต้องเกิดขึ้นในเธรดแยกต่างหากเนื่องจากพวกเขาต้องเกิดขึ้นพร้อมกัน ตัวอย่างเช่นบันทึกของคอร์ดจำเป็นต้องได้ยินร่วมกันดังนั้นแต่ละคนจึงได้รับมอบหมายให้เล่นเธรดของตัวเอง (แก้ไขเพื่อชี้แจง: การโทรnote.play()
ค้างเธรดจนกว่าโน้ตจะเล่นเสร็จและนี่คือเหตุผลที่ฉันต้องการสาม แยกเธรดเพื่อให้สามารถได้ยินโน้ตสามโน้ตพร้อมกัน)
พฤติกรรมแบบนี้จะสร้างเธรดจำนวนมากในระหว่างการเล่นเพลง
ตัวอย่างเช่นลองฟังเพลงที่มีท่วงทำนองสั้น ๆ และเพลงประกอบสั้น ๆ ท่วงทำนองทั้งหมดสามารถเล่นได้ในเธรดเดียว แต่ความก้าวหน้าต้องใช้สามเธรดเพื่อเล่นเนื่องจากแต่ละคอร์ดมีสามโน้ต
ดังนั้นโค้ดหลอกสำหรับการเล่นโปรเกรสซีจึงเป็นดังนี้:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
ดังนั้นสมมติว่าความก้าวหน้ามี 4 คอร์ดและเราเล่นสองครั้งกว่าที่เราเปิด3 notes * 4 chords * 2 times
= 24 เธรด และนี่เป็นเพียงการเล่นครั้งเดียว
จริงๆแล้วมันใช้งานได้ดีในทางปฏิบัติ ฉันไม่เห็นความล่าช้าแฝงที่เห็นได้ชัดหรือข้อบกพร่องที่เกิดจากสิ่งนี้
แต่ฉันต้องการถามว่านี่เป็นการฝึกที่ถูกต้องหรือไม่หรือว่าฉันกำลังทำอะไรผิดปกติ มีเหตุผลหรือไม่ที่จะสร้างเธรดจำนวนมากในแต่ละครั้งที่ผู้ใช้กดปุ่ม? ถ้าไม่ฉันจะทำมันแตกต่างได้อย่างไร
Is it reasonable to create so many threads...
ขึ้นอยู่กับรูปแบบเกลียวของภาษา เธรดที่ใช้สำหรับการขนานจะได้รับการจัดการในระดับระบบปฏิบัติการเพื่อให้ OS สามารถแมปไปยังหลายคอร์ได้ เธรดดังกล่าวมีราคาแพงในการสร้างและสลับระหว่าง หัวข้อสำหรับการทำงานพร้อมกัน (interleaving สองงานไม่จำเป็นต้องดำเนินการทั้งสองพร้อมกัน) สามารถนำมาใช้ในระดับภาษา / VM และสามารถทำให้ "ถูก" มากในการผลิตและสลับระหว่างดังนั้นคุณสามารถพูดคุยกับ 10 เครือข่ายซ็อกเก็ตมากหรือน้อย พร้อมกัน แต่คุณไม่จำเป็นต้องได้รับปริมาณงานของ CPU มากขึ้น