মাল্টিথ্রেডিং: আমি কি এটি ভুল করছি?


23

আমি এমন একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যা সংগীত বাজায়।

প্লেব্যাক চলাকালীন, প্রায়শই জিনিসগুলিকে পৃথক থ্রেডে ঘটতে হয় কারণ তাদের একইসাথে ঘটতে হবে। উদাহরণস্বরূপ, একটি জ্যা প্রয়োজনের নোট, একসঙ্গে শোনা করা তাই প্রতিটি এক অভিনয় করা তার নিজস্ব থ্রেড নির্ধারিত হয় (নির্মল সম্পাদনা:। কলিং 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 times24 টি থ্রেড খোলার চেয়ে দুবার এটি খেলি play এবং এটি কেবল একবার এটি খেলার জন্য।

আসলে, এটি অনুশীলনে সূক্ষ্মভাবে কাজ করে। আমি কোন লক্ষণীয় বিলম্বিতা, বা এর ফলে প্রাপ্ত বাগগুলি লক্ষ্য করি না।

তবে আমি জিজ্ঞাসা করতে চেয়েছিলাম যে এটি সঠিক অনুশীলন, বা আমি যদি মৌলিকভাবে কোনও ভুল করছি। প্রতিবার ব্যবহারকারী কোনও বোতাম চাপলে এতগুলি থ্রেড যুক্তিযুক্ত কি যুক্তিসঙ্গত? যদি তা না হয় তবে আমি কীভাবে এটি আলাদাভাবে করতে পারি?


14
এর পরিবর্তে আপনার অডিও মিশ্রণের কথা বিবেচনা করা উচিত? : আমি কি ফ্রেমওয়ার্ক আপনি ব্যবহার করছেন কিন্তু এখানে একটি উদাহরণ জানি না wiki.libsdl.org/SDL_MixAudioFormat : অথবা, আপনি চ্যানেল ব্যবহার করতে পারে libsdl.org/projects/SDL_mixer/docs/SDL_mixer_25.html#SEC25
Rufflewind

5
Is it reasonable to create so many threads...ভাষার থ্রেডিং মডেলের উপর নির্ভর করে। সমান্তরালতার জন্য ব্যবহৃত থ্রেডগুলি প্রায়শই ওএস স্তরে পরিচালিত হয় যাতে ওএস তাদের একাধিক কোরে মানচিত্র করতে পারে। এই ধরনের থ্রেডগুলি তৈরি এবং এর মধ্যে স্যুইচ করা ব্যয়বহুল। সম্মতিযুক্ত জন্য থ্রেডস (দুটি কাজ আন্তঃবিবাহকরণ, অগত্যা উভয় একযোগে কার্যকর করা নয়) ভাষা / ভিএম স্তরে প্রয়োগ করা যেতে পারে এবং উত্পাদন এবং স্যুইচ করার জন্য অত্যন্ত "সস্তা" তৈরি করা যায় যাতে আপনি বলতে পারেন, কম বেশি 10 নেটওয়ার্ক সকেটের সাথে কথা বলতে পারেন একই সাথে, তবে আপনি অগত্যা সেভাবে আরও সিপিইউ থ্রুপুট পাবেন না।
ডোভাল

3
একদিকে, অন্যরা একবারে একাধিক শব্দ বাজানোর জন্য থ্রেডগুলি ভুল পদ্ধতি হওয়ার বিষয়ে অবশ্যই সঠিক।
ডোভাল

3
শব্দ তরঙ্গ কীভাবে কাজ করে তার সাথে আপনার কি অনেক পরিচিতি আছে? সাধারণত আপনি দুটি সাউন্ড ওয়েভ (একই বিটরেটে উল্লিখিত) এর মান একসাথে একটি নতুন শব্দ তরঙ্গে রচনা করে একটি জ্যোতি তৈরি করেন। জটিল তরঙ্গগুলি সাধারণগুলি থেকে তৈরি করা যেতে পারে; একটি গান বাজানোর জন্য আপনার কেবল কখনও একক তরঙ্গরূপ প্রয়োজন।
কেচালাক্স

যেহেতু আপনি বলছেন যে নোট.প্লে () অবিচ্ছিন্ন নয়, তাই প্রতিটি নোট.প্লে () এর জন্য একটি থ্রেড তাই একসাথে একাধিক নোট খেলতে পারা যায়। নিঃসন্দেহে .., আপনি সেই নোটগুলিকে একের সাথে একত্রিত করতে সক্ষম হন যা আপনি পরে একটি থ্রেডে খেলেন। যদি এটি সম্ভব না হয় তবে আপনার পদ্ধতির সাহায্যে আপনাকে কিছুটা প্রক্রিয়া ব্যবহার করতে হবে যাতে তারা নিশ্চিত হয়ে যায় যে তারা নিশ্চিত থাকে
pnizzle

উত্তর:


46

আপনার করা একটি অনুমান বৈধ হবে না: আপনার থ্রেডগুলি একই সাথে কার্যকর করা দরকার। 3 টির জন্য কাজ করতে পারে তবে এক পর্যায়ে সিস্টেমে প্রথমে কোন থ্রেডটি চালানো উচিত এবং কোনটি অপেক্ষা করতে হবে তা অগ্রাধিকার দেওয়া দরকার।

আপনার বাস্তবায়ন শেষ পর্যন্ত আপনার এপিআইয়ের উপর নির্ভর করবে, তবে বেশিরভাগ আধুনিক এপিআইগুলি আপনাকে কী খেলতে চায় এবং সময় নির্ধারণ এবং নিজের সারি সন্ধানের জন্য আগেভাগে বলতে দেয়। আপনি যদি কোনও বিদ্যমান সিস্টেম এপিআই উপেক্ষা করে নিজেই এমন একটি এপিআই কোড করে থাকেন (তবে আপনি কেন করবেন!), ইভেন্টের সারিটি আপনার নোটগুলিকে মিশ্রিত করে এবং একটি থ্রেড থেকে সেগুলি খেললে নোট মডেলের প্রতি থ্রেডের চেয়ে আরও ভাল পদ্ধতির মতো দেখায়।


36
বা এটিকে অন্যভাবে বর্ণনা করতে - সিস্টেম একবার শুরু হওয়ার পরে কোনও থ্রেডের ক্রম, ক্রম বা সময়কালের গ্যারান্টি দেয় না এবং দিতে পারে না।
জেমস অ্যান্ডারসন

2
@ জেমস অ্যান্ডারসন যদি না কেউ সমন্বয় সাধনের জন্য ব্যাপক প্রচেষ্টা গ্রহণ করে তবে শেষ পর্যন্ত প্রায় সমালোচিত হয়ে দাঁড়াবে।
চিহ্নিত করুন

'এপিআই' দ্বারা আপনি যে অডিও লাইব্রেরিটি ব্যবহার করছেন তা বোঝাতে চাইছেন?
আভিভ কোহন ২

1
@ প্রোগ হ্যাঁ আমি নিশ্চিত যে এটিতে আরও সুবিধাজনক কিছু রয়েছে note প্লে ()
পিটিএক্স

26

লকস্টেপে চালানো থ্রেডগুলির উপর নির্ভর করবেন না। আমার জানা প্রতিটি অপারেটিং সিস্টেম গ্যারান্টিটি দেয় না যে থ্রেডগুলি একে অপরের সাথে সামঞ্জস্যপূর্ণ সময়ে কার্যকর হয়। এর অর্থ হ'ল সিপিইউ যদি 10 টি থ্রেড চালায় তবে অগত্যা যে কোনও সেকেন্ডে তারা সমান সময় পাবে না। তারা দ্রুত সিঙ্ক থেকে বেরিয়ে যেতে পারে, বা তারা সিঙ্কে পুরোপুরি থাকতে পারে। এটি থ্রেডের প্রকৃতি: কোনও কিছুরই গ্যারান্টি দেওয়া হয় না, যেহেতু তাদের মৃত্যুদণ্ড কার্যকর করা আচরণবিরোধী নয়

এই নির্দিষ্ট আবেদন জন্য, আমি আপনি যদি একটি থাকতে হবে বিশ্বাস একক থ্রেড যে হ্রাস সঙ্গীত নোট। এটি নোটগুলি গ্রাস করার আগে, অন্য কিছু প্রক্রিয়াতে বাদ্যযন্ত্রগুলি, স্টাফগুলিকে, যা কিছু সংগীতের একক টুকরোতে মার্জ করা উচিত ।

আসুন আমরা ধরে নিই যে আপনার কাছে উদাহরণস্বরূপ তিনটি থ্রেড উত্পাদনকারী নোট রয়েছে। আমি তাদের একক ডেটা স্ট্রাকচারে সিঙ্ক্রোনাইজ করব যেখানে তারা সকলেই তাদের সংগীত রাখতে পারে put অন্য একটি থ্রেড (ভোক্তা) সম্মিলিত নোটগুলি পড়ে এবং সেগুলি চালায়। থ্রেড সময় নোট নিখোঁজ হয় না তা নিশ্চিত করতে এখানে একটি সংক্ষিপ্ত বিলম্বের প্রয়োজন হতে পারে।

সম্পর্কিত পড়া: প্রযোজক-ভোক্তার সমস্যা


1
উত্তর করার জন্য ধন্যবাদ. আমি ১০০% নিশ্চিত নই যে আমি আপনার উত্তরটি বুঝতে পেরেছি, তবে একই সাথে 3 টি নোট খেলতে আমার 3 টি থ্রেড কেন প্রয়োজন তা আপনি বুঝতে পেরেছিলেন তা নিশ্চিত করতে চেয়েছিলাম: কারণ note.play()নোটটি বাজানো না হওয়া পর্যন্ত কল করা থ্রেডকে হিমশীতল করে। সুতরাং play()একই সময়ে আমার কাছে 3 টি নোট সক্ষম হওয়ার জন্য এটি করার জন্য আমার 3 টি আলাদা থ্রেডের প্রয়োজন। আপনার সমাধান আমার পরিস্থিতি মোকাবেলা করে?
আভিভ কোহন

না, এবং এটি প্রশ্ন থেকে পরিষ্কার ছিল না। কোনও সুতোর জোরে বাজানোর কোনও উপায় নেই?

4

এই সঙ্গীত সমস্যার জন্য একটি ক্লাসিক পদ্ধতি হ'ল দুটি থ্রেড ব্যবহার করা হবে । এক, নিম্ন অগ্রাধিকারের থ্রেডটি ইউআই বা শব্দ উত্পন্ন কোডের মতো পরিচালনা করবে

void playProgression(Progression prog){
    for(Chord chord : prog)
        for(Note note : chord)
            otherthread.startPlaying(note);
}

(কেবলমাত্র নোটটি অবিচ্ছিন্নভাবে শুরু করার এবং এটি শেষ হওয়ার অপেক্ষায় না রেখে ধারণাটি নোট করুন )

এবং দ্বিতীয়টি, রিয়েলটাইম থ্রেড ধারাবাহিকভাবে সমস্ত নোট, শব্দ, নমুনা ইত্যাদির দিকে নজর রাখবে যা এখন খেলতে হবে; তাদের মিশ্রিত করুন এবং চূড়ান্ত তরঙ্গরূপটি আউটপুট দিন। এই অংশটি কোনও পালিশ তৃতীয় পক্ষের লাইব্রেরি থেকে নেওয়া (এবং প্রায়শই হয়) হতে পারে।

এই থ্রেডটি প্রায়শই সংস্থানগুলির "অনাহারে" খুব সংবেদনশীল হয় - যদি কোনও আসল সাউন্ড আউটপুট প্রসেসিং আপনার সাউন্ড কার্ড বাফার আউটপুটটির চেয়ে বেশি সময়ের জন্য অবরুদ্ধ থাকে, তবে এটি বাধা বা পপসের মতো শ্রবণযোগ্য শিল্পকর্মের কারণ হয়ে দাঁড়ায়। আপনার যদি 24 টি থ্রেড থাকে যা সরাসরি অডিও আউটপুট দেয়, তবে আপনার আরও অনেক বেশি সম্ভাবনা রয়েছে যে সেগুলির মধ্যে কোনও একটি কোনও সময় হাঁপিয়ে উঠবে। এটি প্রায়শই অগ্রহণযোগ্য হিসাবে বিবেচিত হয়, কারণ মানুষ অডিও গ্ল্যাচগুলির চেয়ে সংবেদনশীল (ভিজ্যুয়াল শৈল্পিকাগুলির চেয়ে অনেক বেশি) এবং এমনকি ছোটখাটো তোড়জোড় লক্ষ্য করে।


1
ওপি বলেছে যে এপিআই একবারে কেবল একটি নোট খেলতে পারে
মিংিং হাঁস

4
@ মুভিংডাক যদি এপিআই মিশ্রিত করতে পারে তবে তা মিশ্রিত হওয়া উচিত; যদি ওপি বলে যে এপিআই মেশাতে পারে না তবে সমাধানটি আপনার কোডে মিশ্রিত করা এবং অন্য থ্রেডটি এপিআইয়ের মাধ্যমে my_mixed_notes_from_ whole_chord_progression.play () সম্পাদন করা উচিত।
পিটারিস

1

হ্যাঁ, আপনি কিছু ভুল করছেন wrong

প্রথম জিনিসটি থ্রেডগুলি তৈরি করা ব্যয়বহুল। এটিতে কেবল একটি ফাংশন কল করার চেয়ে অনেক বেশি ওভারহেড রয়েছে।

সুতরাং আপনার কি করা উচিত, যদি এই কাজের জন্য আপনার একাধিক থ্রেডের দরকার হয় তা হ'ল থ্রেডগুলি পুনর্ব্যবহার করা।

আমার কাছে যেমন মনে হচ্ছে আপনার কাছে একটি মূল থ্রেড রয়েছে যা অন্যান্য থ্রেডের সময়সূচী করে। সুতরাং মূল থ্রেড সংগীতের মাধ্যমে পরিচালিত হয় এবং যখনই কোনও নতুন নোট প্লে করা হয় তখন নতুন থ্রেড শুরু হয়। সুতরাং থ্রেডগুলি মারা যেতে এবং সেগুলি পুনরায় চালু করার পরিবর্তে আরও ভালভাবে অন্য থ্রেডগুলিকে স্লিপ লুপে বাঁচিয়ে রাখুন, যেখানে কোনও নতুন নোট বাজানোর জন্য এবং অন্যথায় ঘুমানোর ক্ষেত্রে তারা প্রতি x মিলিসেকেন্ড (বা ন্যানোসেকেন্ড) পরীক্ষা করে। মূল থ্রেড তখন নতুন থ্রেড শুরু করে না তবে বিদ্যমান থ্রেড পুলকে নোট খেলতে বলে। পুলটিতে পর্যাপ্ত থ্রেড না থাকলেই এটি নতুন থ্রেড তৈরি করতে পারে।

পরেরটি হল সিঙ্ক্রোনাইজেশন। কোনও আধুনিক মাল্ট্রিথ্রেডিং সিস্টেম আসলেই গ্যারান্টি দেয় যে সমস্ত থ্রেড একই সাথে কার্যকর করা হয়েছিল। আপনার যদি কোর (যা বেশিরভাগ ক্ষেত্রে হয়) এর চেয়ে মেশিনে আরও থ্রেড এবং প্রক্রিয়াগুলি চলমান থাকে তবে থ্রেডগুলি সিপিইউয়ের 100% সময় পায় না। তাদের সিপিইউ শেয়ার করতে হবে। এর অর্থ প্রতিটি থ্রেড একটি স্বল্প পরিমাণে সিপিইউ সময় পায় এবং তারপরে এটি ভাগ হয়ে যাওয়ার পরে পরবর্তী থ্রেডটি স্বল্প সময়ের জন্য সিপিইউ পায়। সিস্টেমটি গ্যারান্টি দেয় না যে আপনার থ্রেডটি অন্যান্য থ্রেডের মতো একই সিপিইউ সময় পায়। এর অর্থ, একটি থ্রেড অন্য একটি শেষ হওয়ার অপেক্ষায় থাকতে পারে এবং এভাবে বিলম্ব হতে পারে।

এক থ্রেডে একাধিক নোট প্লে করা সম্ভব না হলে আপনার পরিবর্তে নজর দেওয়া উচিত, যাতে থ্রেডটি সমস্ত নোট প্রস্তুত করে এবং তারপরে কেবল "স্টার্ট" কমান্ড দেয়।

আপনার যদি থ্রেড সহ এটি করার দরকার হয় তবে কমপক্ষে থ্রেডগুলি পুনরায় ব্যবহার করুন। তারপরে পুরো টুকরোতে যতগুলি নোট রয়েছে তত বেশি থ্রেড রাখার দরকার নেই, তবে একই সময়ে সর্বাধিক সংখ্যক নোট হিসাবে খেলতে হবে as


"[কি] এক থ্রেডে একাধিক নোট চালানো সম্ভব, যাতে থ্রেড সমস্ত নোট প্রস্তুত করে এবং তারপরে কেবল" শুরু "আদেশ দেয়" " - এটি আমার প্রথম চিন্তাও ছিল। আমি মাঝে মাঝে ভাবতে পারি যে মাল্টিথ্রিডিং সম্পর্কে মন্তব্য সহ বোমা হামলা করা হচ্ছে (যেমন প্রোগ্রামারস.স্ট্যাকেক্সেঞ্জার / প্রশ্নস / ৪৩৩৩২ / ২ ) ডিজাইনের সময় প্রচুর প্রোগ্রামারকে বিপথগামী করে না। আমি কোনও বড়, আপ-ফ্রন্ট প্রক্রিয়া সম্পর্কে সংশয়বাদী যা শেষ হওয়ার জন্য থ্রুগুলির একগুচ্ছ জন্য প্রয়োজনীয়তা পোস্ট করে। আমি একক থ্রেড সমাধানের জন্য আন্তরিকভাবে দেখার পরামর্শ দেব।
ব্যবহারকারী 1172763

1

ব্যবহারিক উত্তরটি হ'ল এটি যদি আপনার অ্যাপ্লিকেশনটির জন্য কাজ করে এবং আপনার বর্তমান প্রয়োজনীয়তা পূরণ করে তবে আপনি এটি ভুল করছেন না :) তবে আপনি যদি "এটি একটি স্কেলযোগ্য, দক্ষ, পুনরায় ব্যবহারযোগ্য সমাধান" বলতে চান তবে উত্তরটি হ'ল না। নকশাগুলি থ্রেডগুলি কীভাবে আচরণ করবে যা বিভিন্ন পরিস্থিতিতে (দীর্ঘতর সুর, আরও যুগপত নোট, বিভিন্ন হার্ডওয়্যার ইত্যাদি) সত্য হতে পারে বা না সে সম্পর্কে অনেক অনুমান করে।

বিকল্প হিসাবে একটি সময় লুপ এবং একটি থ্রেড পুল ব্যবহার বিবেচনা করুন । টাইমিং লুপটি তার নিজস্ব থ্রেডে চলে এবং কোনও নোট বাজানোর দরকার হয় কিনা তা ক্রমাগত পরীক্ষা করে cks এটি মেলোডি শুরু হওয়ার সময়ের সাথে সিস্টেম সময়ের তুলনা করে এটি করে। প্রতিটি নোটের সময় সাধারণত সুরের টেম্পো এবং নোটগুলির ক্রম থেকে খুব সহজেই গণনা করা যায়। একটি নতুন নোট প্লে করা দরকার হিসাবে একটি থ্রেড পুল থেকে একটি থ্রেড ধার play()করুন এবং নোটের মধ্যে ফাংশনটি কল করুন। টাইমিং লুপটি বিভিন্ন উপায়ে কাজ করতে পারে তবে সহজতম সিপিইউ ব্যবহার কমাতে সংক্ষিপ্ত ঘুমের (সম্ভবত জলের মাঝে) একটি অবিচ্ছিন্ন লুপ।

এই নকশার একটি সুবিধা হ'ল থ্রেডের সংখ্যা একযোগে নোটগুলির সর্বাধিক সংখ্যা + 1 (টাইমিং লুপ) এর বেশি হবে না। এছাড়াও টাইমিং লুপটি আপনাকে সময়কালে পিছলে যাওয়া থেকে রক্ষা করে যা থ্রেডের বিলম্বের কারণে হতে পারে। তৃতীয়ত: সুরের টেম্পো ঠিক করা হয়নি এবং সময়গুলির গণনা পরিবর্তন করে পরিবর্তন করা যেতে পারে।

অন্যদিকে, আমি অন্যান্য মন্তব্যকারীদের সাথে সম্মত হই যে ফাংশনটি note.play()কাজ করার জন্য খুব দুর্বল এপিআই। যে কোনও যুক্তিসঙ্গত সাউন্ড এপিআই আপনাকে আরও নমনীয় উপায়ে নোটগুলি মিশ্রিত করতে এবং শিডিয়ুল করার অনুমতি দেয়। এটি বলেছিল, কখনও কখনও আমরা যা পেতাম তা নিয়েই বাঁচতে হয় :)


0

আপনার কাছে যে API ব্যবহার করতে হবে তা ধরে নিলে একটি সাধারণ বাস্তবায়ন হিসাবে আমার কাছে সূক্ষ্ম দেখাচ্ছে । অন্যান্য উত্তরগুলি কেন এটি খুব ভাল এপিআই নয়, তা কভার করে, তাই আমি এর চেয়ে বেশি কথা বলছি না, আমি কেবল ধরে নিই যে এটিই আপনার সাথে থাকতে হবে। আপনার পন্থাটি প্রচুর পরিমাণে থ্রেড ব্যবহার করবে, তবে একটি আধুনিক পিসিতে যতক্ষণ থ্রেডের গণনা ডজনের মধ্যে থাকে কোনও উদ্বেগ হওয়া উচিত নয়।

আপনার একটি জিনিস করা উচিত, যদি সম্ভব হয় (যেমন, ব্যবহারকারী কীবোর্ডের পরিবর্তে ফাইল থেকে বাজানো), কিছুটা বিলম্বিতা যুক্ত করা। সুতরাং আপনি একটি থ্রেড শুরু করেন, এটি সিস্টেম ঘড়ির নির্দিষ্ট সময় অবধি ঘুমায় এবং সঠিক সময়ে একটি নোট খেলতে শুরু করে (নোট, কখনও কখনও ঘুম খুব তাড়াতাড়ি ব্যাহত হতে পারে, তাই ঘড়িটি পরীক্ষা করুন এবং প্রয়োজনে আরও ঘুমান)। আপনার ঘুম শেষ হওয়ার পরে ওএস থ্রেডটি চালিয়ে যাওয়ার কোনও গ্যারান্টি নেই যদিও (আপনি যদি রিয়েল-টাইম অপারেটিং সিস্টেম ব্যবহার না করেন) তবে থ্রেডটি শুরু করা এবং সময় পরীক্ষা না করে খেলতে শুরু করা তার চেয়ে অনেক বেশি সঠিক হওয়ার সম্ভাবনা রয়েছে While ।

তারপরে পরবর্তী পদক্ষেপ, যা জিনিসগুলিকে কিছুটা জটিল করে তোলে তবে খুব বেশি নয় এবং থ্রেড পুল ব্যবহার করে আপনাকে উল্লিখিত বিলম্বকে হ্রাস করতে দেয়। এটি হ'ল, যখন কোনও থ্রেড কোনও নোট শেষ করে, এটি প্রস্থান করে না, পরিবর্তে নতুন নোটটি খেলার জন্য অপেক্ষা করে। এবং আপনি যখন কোনও নোট বাজানো শুরু করার অনুরোধ করবেন, আপনি প্রথমে পুল থেকে একটি মুক্ত থ্রেড নেওয়ার চেষ্টা করবেন এবং প্রয়োজনে কেবল নতুন থ্রেড যুক্ত করুন। এটির জন্য আপনার বর্তমান অগ্নি-ভুলে যাওয়া পদ্ধতির পরিবর্তে কিছু সাধারণ আন্তঃ-থ্রেড যোগাযোগের প্রয়োজন হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.