আমি পরিচালনা করি এমন আমার নতুন দলে, আমাদের কোডগুলির বেশিরভাগটি প্ল্যাটফর্ম, টিসিপি সকেট এবং HTTP নেটওয়ার্কিং কোড। সমস্ত সি ++। এর বেশিরভাগের উদ্ভব অন্যান্য বিকাশকারীদের যারা দল ছেড়েছেন। দলের বর্তমান বিকাশকারীরা খুব স্মার্ট, তবে অভিজ্ঞতার দিক থেকে বেশিরভাগ জুনিয়র।
আমাদের বৃহত্তম সমস্যা: বহু-থ্রেডযুক্ত সম্মতিযুক্ত বাগ। আমাদের ক্লাসের বেশিরভাগ লাইব্রেরি কিছু থ্রেড পুল ক্লাস ব্যবহার করে অ্যাসিনক্রোনাস হিসাবে লেখা। ক্লাসের লাইব্রেরিতে থাকা পদ্ধতিগুলি একটি থ্রেড থেকে থ্রেড পুলে প্রায়শই দীর্ঘ চলমান টাকা সজ্জিত করে এবং তারপরে class শ্রেণীর কলব্যাক পদ্ধতিগুলি অন্য কোনও থ্রেডে ডাকা হয়। ফলস্বরূপ, আমাদের কাছে ভুল থ্রেডিং অনুমান জড়িত প্রচুর এজ কেস বাগ রয়েছে। এই সূক্ষ্ম বাগের ফলাফল যা সমালোচনা সংক্রান্ত বিষয়গুলি থেকে রক্ষা পেতে কেবল সমালোচনামূলক বিভাগ এবং লকগুলি ছাড়িয়ে যায়।
এই সমস্যাগুলিকে আরও শক্ত করে তোলে তা হ'ল সমাধান করার প্রচেষ্টা প্রায়শই ভুল হয়। আমি টিম চেষ্টা করছে এমন কিছু ভুল পর্যবেক্ষণ করেছে (বা উত্তরাধিকারের কোডের মধ্যেই) নীচের মতো কিছু রয়েছে:
সাধারণ ভুল # 1 - ভাগ করা ডেটার চারপাশে একটি লক রেখে সামঞ্জস্য ইস্যু ঠিক করা, তবে যখন পদ্ধতিগুলি প্রত্যাশিত ক্রমে ডাকা হয় না তখন কী ঘটে তা ভুলে যায়। এখানে একটি খুব সাধারণ উদাহরণ:
void Foo::OnHttpRequestComplete(statuscode status)
{
m_pBar->DoSomethingImportant(status);
}
void Foo::Shutdown()
{
m_pBar->Cleanup();
delete m_pBar;
m_pBar=nullptr;
}
সুতরাং এখন আমাদের কাছে একটি বাগ রয়েছে যাতে অনট্যাট নেট নেটওয়ার্কসম্পিউট কমপ্লিট হওয়ার সময় শাটডাউন কল হতে পারে called একজন পরীক্ষক ত্রুটিটি সন্ধান করে, ক্র্যাশ ডাম্প ক্যাপচার করে এবং বাগটিকে বিকাশকারীকে বরাদ্দ করে। তিনি ঘুরে ফিরে বাগটি ঠিক করেন।
void Foo::OnHttpRequestComplete(statuscode status)
{
AutoLock lock(m_cs);
m_pBar->DoSomethingImportant(status);
}
void Foo::Shutdown()
{
AutoLock lock(m_cs);
m_pBar->Cleanup();
delete m_pBar;
m_pBar=nullptr;
}
উপরের ফিক্সটি দুর্দান্ত দেখাচ্ছে যতক্ষণ না আপনি উপলব্ধি করেন যে এর চেয়েও আরও সূক্ষ্ম প্রান্তের কেস রয়েছে। OnHttpRequestComplete ফিরে আসার আগে যদি শাটডাউন কল হয় তবে কি হবে ? আমার টিমের আসল বিশ্বের উদাহরণগুলি আরও জটিল এবং এজ রিডিং কোড পর্যালোচনা প্রক্রিয়া চলাকালীন আরও শক্ত।
সাধারণ ভুল # 2 - লকটি অন্ধভাবে প্রস্থান করে অচলাবস্থার সমস্যাগুলি ঠিক করা, অন্য থ্রেডটি শেষ হওয়ার জন্য অপেক্ষা করুন, তারপরে লকটি পুনরায় প্রবেশ করুন - তবে বিষয়টি পরিচালনা না করেই অন্য থ্রেডের সাহায্যে অবজেক্টটি আপডেট হয়েছে!
সাধারণ ত্রুটি # 3 - যদিও অবজেক্টগুলি রেফারেন্স হিসাবে গণনা করা হচ্ছে, শাটডাউন ক্রমটি এটির নির্দেশক "প্রকাশ" করে। তবে থ্রেডটির অপেক্ষা করতে ভুলে যায় যা এর উদাহরণটি প্রকাশ করতে এখনও চলছে running এই হিসাবে, উপাদানগুলি পরিষ্কারভাবে বন্ধ হয়ে যায়, তারপরে উত্সাহী বা দেরী কলব্যাকগুলি কোনও রাজ্যের কোনও বস্তুর সাথে আর কোনও কল প্রত্যাশা করে না।
অন্যান্য প্রান্তের কেস রয়েছে, তবে নীচের অংশটি হ'ল:
মাল্টিথ্রেডেড প্রোগ্রামিং কেবল স্মার্ট লোক, এমনকি স্মার্ট লোকদের জন্য।
আমি এই ভুলগুলি ধরার সাথে সাথে প্রতিটি বিকাশকারীর সাথে আরও উপযুক্ত সমাধানের বিকাশে ত্রুটিগুলি নিয়ে আলোচনায় সময় ব্যয় করি। তবে আমার সন্দেহ হয় যে তারা প্রায়শই প্রতিটি সমস্যার সমাধান কীভাবে বিভ্রান্তিতে থাকে কারণ প্রচুর পরিমাণে উত্তরাধিকার কোড যে "ডান" ফিক্সটি স্পর্শ করবে involve
আমরা শীঘ্রই শিপিং করব, এবং আমি নিশ্চিত যে আমরা প্রয়োগ করছি এমন প্যাচগুলি আসন্ন মুক্তির জন্য রাখবে। এরপরে, আমাদের প্রয়োজনীয় কোড কোড এবং রিফ্যাক্টরটি উন্নত করার জন্য কিছু সময় থাকবে। আমাদের কেবল সবকিছু নতুন করে লেখার সময় হবে না। এবং সংখ্যাগরিষ্ঠ কোডটি সমস্ত খারাপ নয়। তবে আমি এমন রিফ্যাক্টর কোডটি খুঁজছি যে থ্রেডিংয়ের সমস্যাগুলি পুরোপুরি এড়ানো যায়।
একটি পদ্ধতির আমি বিবেচনা করছি এটি হ'ল। প্রতিটি তাত্পর্যপূর্ণ প্ল্যাটফর্ম বৈশিষ্ট্যের জন্য, একটি ডেডিকেটেড একক থ্রেড রাখুন যেখানে সমস্ত ইভেন্ট এবং নেটওয়ার্ক কলব্যাকগুলি মার্শাল হয়ে যায়। মেসেজ লুপের ব্যবহারের সাথে উইন্ডোজে সিওএম অ্যাপার্টমেন্ট থ্রেডিংয়ের অনুরূপ। দীর্ঘ অবরুদ্ধ অপারেশনগুলি এখনও একটি কাজের পুলের থ্রেডে প্রেরণ করতে পারে তবে সম্পূর্ণকরণ কলব্যাকটি উপাদানটির থ্রেডে চালিত হয়। উপাদানগুলি সম্ভবত একই থ্রেড ভাগ করে নিতে পারে। তারপরে থ্রেডের অভ্যন্তরে চলমান সমস্ত শ্রেণীর পাঠাগারগুলি একক থ্রেড ওয়ার্ল্ডের অনুমানের অধীনে রচনা করা যেতে পারে।
আমি সেই পথে নামার আগে, মাল্টিথ্রেড সমস্যা সমাধানের জন্য যদি অন্যান্য মানক কৌশল বা ডিজাইনের ধরণ থাকে তবে আমি খুব আগ্রহী। এবং আমাকে জোর দিতে হবে - একটি বইয়ের বাইরে যা মাইটেক্সেস এবং সেমোফোরের মূল বিষয়গুলি বর্ণনা করে। আপনি কি মনে করেন?
আমি একটি রিফ্যাক্টরিং প্রক্রিয়া দিকে নিয়ে যেতে অন্য যে কোনও পন্থায় আগ্রহী। নিম্নলিখিত যে কোনওটি সহ:
থ্রেডের চারপাশে নকশার নিদর্শনগুলিতে সাহিত্য বা কাগজপত্র। মিটেক্সেস এবং সেমোফোরগুলির পরিচিতির বাইরে কিছু। আমাদের কোনও বৃহত্তর সমান্তরালতার দরকার নেই, কেবল কোনও বিষয় মডেল ডিজাইনের উপায়গুলি যাতে অন্য থ্রেড থেকে অ্যাসিঙ্ক্রোনাস ইভেন্টগুলি সঠিকভাবে পরিচালনা করতে পারে ।
বিভিন্ন উপাদানগুলির থ্রেডিংয়ের চিত্রটি আঁকার উপায়, যাতে এর জন্য অধ্যয়ন এবং সমাধানগুলি সমাধান করা সহজ হবে। (এটি, বস্তু এবং শ্রেণি জুড়ে থ্রেড নিয়ে আলোচনার জন্য একটি ইউএমএল সমতুল্য)
মাল্টিথ্রেড কোড সহ আপনার বিকাশ দলকে শিক্ষিত করা।
আপনি কি করতে চান?