আমি এমন একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যা সংগীত বাজায়।
প্লেব্যাক চলাকালীন, প্রায়শই জিনিসগুলিকে পৃথক থ্রেডে ঘটতে হয় কারণ তাদের একইসাথে ঘটতে হবে। উদাহরণস্বরূপ, একটি জ্যা প্রয়োজনের নোট, একসঙ্গে শোনা করা তাই প্রতিটি এক অভিনয় করা তার নিজস্ব থ্রেড নির্ধারিত হয় (নির্মল সম্পাদনা:। কলিং note.play()
থ্রেড স্থির না হওয়া পর্যন্ত নোট সম্পন্ন বাজানো, এবং এই আমি কেন তিন প্রয়োজন একই সাথে তিনটি নোট শোনার জন্য পৃথক থ্রেড)
এই ধরণের আচরণ সঙ্গীতের একটি অংশের প্লেব্যাক চলাকালীন অনেকগুলি থ্রেড তৈরি করে।
উদাহরণস্বরূপ, একটি সংক্ষিপ্ত সুর এবং সংক্ষিপ্ত সঙ্গীত জ্যা অগ্রগতির সাথে সংগীতটির একটি অংশ বিবেচনা করুন। পুরো সুরটি একক থ্রেডে প্লে করা যায়, তবে অগ্রগতির জন্য তিনটি থ্রেড বাজানো দরকার, কারণ এর প্রতিটি চিরায় তিনটি নোট রয়েছে।
সুতরাং একটি অগ্রগতি খেলার জন্য সিউডো কোডটি দেখতে এরকম দেখাচ্ছে:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
সুতরাং ধরে নিচ্ছি অগ্রগতিতে 4 টি chords রয়েছে এবং আমরা 3 notes * 4 chords * 2 times
24 টি থ্রেড খোলার চেয়ে দুবার এটি খেলি play এবং এটি কেবল একবার এটি খেলার জন্য।
আসলে, এটি অনুশীলনে সূক্ষ্মভাবে কাজ করে। আমি কোন লক্ষণীয় বিলম্বিতা, বা এর ফলে প্রাপ্ত বাগগুলি লক্ষ্য করি না।
তবে আমি জিজ্ঞাসা করতে চেয়েছিলাম যে এটি সঠিক অনুশীলন, বা আমি যদি মৌলিকভাবে কোনও ভুল করছি। প্রতিবার ব্যবহারকারী কোনও বোতাম চাপলে এতগুলি থ্রেড যুক্তিযুক্ত কি যুক্তিসঙ্গত? যদি তা না হয় তবে আমি কীভাবে এটি আলাদাভাবে করতে পারি?
Is it reasonable to create so many threads...
ভাষার থ্রেডিং মডেলের উপর নির্ভর করে। সমান্তরালতার জন্য ব্যবহৃত থ্রেডগুলি প্রায়শই ওএস স্তরে পরিচালিত হয় যাতে ওএস তাদের একাধিক কোরে মানচিত্র করতে পারে। এই ধরনের থ্রেডগুলি তৈরি এবং এর মধ্যে স্যুইচ করা ব্যয়বহুল। সম্মতিযুক্ত জন্য থ্রেডস (দুটি কাজ আন্তঃবিবাহকরণ, অগত্যা উভয় একযোগে কার্যকর করা নয়) ভাষা / ভিএম স্তরে প্রয়োগ করা যেতে পারে এবং উত্পাদন এবং স্যুইচ করার জন্য অত্যন্ত "সস্তা" তৈরি করা যায় যাতে আপনি বলতে পারেন, কম বেশি 10 নেটওয়ার্ক সকেটের সাথে কথা বলতে পারেন একই সাথে, তবে আপনি অগত্যা সেভাবে আরও সিপিইউ থ্রুপুট পাবেন না।