मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं जो संगीत बजाता है।
प्लेबैक के दौरान, अक्सर चीजों को अलग-अलग थ्रेड्स पर होने की आवश्यकता होती है क्योंकि उन्हें एक साथ होने की आवश्यकता होती है। उदाहरण के लिए, एक राग के नोटों को एक साथ सुनने की आवश्यकता होती है, इसलिए प्रत्येक को अपना स्वयं का थ्रेड खेलने के लिए सौंपा जाता है (इसे स्पष्ट करने के लिए संपादित करें: 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...
भाषा के थ्रेडिंग मॉडल पर निर्भर करता है। समानता के लिए उपयोग किए जाने वाले थ्रेड्स को अक्सर ओएस स्तर पर नियंत्रित किया जाता है ताकि ओएस उन्हें कई कोर में मैप कर सके। इस तरह के धागे बनाने और बीच में स्विच करने के लिए महंगे हैं। कंसीडर के लिए थ्रेड्स (दो कार्यों को एक साथ करना, जरूरी नहीं कि दोनों को एक साथ निष्पादित करना) को भाषा / वीएम स्तर पर कार्यान्वित किया जा सकता है और इसे 10 नेटवर्क सॉकेट पर अधिक या कम से बात करने के लिए उत्पादन करने और स्विच करने के लिए बेहद "सस्ता" बनाया जा सकता है। एक साथ, लेकिन जरूरी नहीं कि आपको अधिक सीपीयू थ्रूपुट मिल जाए।