বহুবিবাহিত বাগ দ্বারা জর্জরিত


26

আমি পরিচালনা করি এমন আমার নতুন দলে, আমাদের কোডগুলির বেশিরভাগটি প্ল্যাটফর্ম, টিসিপি সকেট এবং 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

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

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

আমি সেই পথে নামার আগে, মাল্টিথ্রেড সমস্যা সমাধানের জন্য যদি অন্যান্য মানক কৌশল বা ডিজাইনের ধরণ থাকে তবে আমি খুব আগ্রহী। এবং আমাকে জোর দিতে হবে - একটি বইয়ের বাইরে যা মাইটেক্সেস এবং সেমোফোরের মূল বিষয়গুলি বর্ণনা করে। আপনি কি মনে করেন?

আমি একটি রিফ্যাক্টরিং প্রক্রিয়া দিকে নিয়ে যেতে অন্য যে কোনও পন্থায় আগ্রহী। নিম্নলিখিত যে কোনওটি সহ:

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

  2. বিভিন্ন উপাদানগুলির থ্রেডিংয়ের চিত্রটি আঁকার উপায়, যাতে এর জন্য অধ্যয়ন এবং সমাধানগুলি সমাধান করা সহজ হবে। (এটি, বস্তু এবং শ্রেণি জুড়ে থ্রেড নিয়ে আলোচনার জন্য একটি ইউএমএল সমতুল্য)

  3. মাল্টিথ্রেড কোড সহ আপনার বিকাশ দলকে শিক্ষিত করা।

  4. আপনি কি করতে চান?


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

20
আমার পক্ষে যা ভাল কাজ করে তা হ'ল সম্ভব যখনই সম্ভব পরিবর্তন থেকে মুক্তি পাওয়া । আমি যখন নতুন মানটি পাস করার জন্য পরিবর্তনীয় অবজেক্টের স্থিতি পরিবর্তন করতে দেখি, তখন আমি রিফ্যাক্টরটি চেষ্টা করি যে পরিবর্তে পরিবর্তিত মানের পরিবর্তে একটি নতুন অপরিবর্তনীয় অবজেক্টকে পাশ করার মধ্যে। বস্তুর আরম্ভের নিরাপদে সম্পন্ন করা হয়, তাহলে এই নিশ্চয়তা তথ্য ঘোড়দৌড় অভাবে - বেশ একটি ত্রাণ
মশা

3
মাল্টি-থ্রেড নরকে স্বাগতম। আমি 20 বছর ধরে অ্যাডা, ওকামে, সি ++ এ মাল্টি-থ্রেড / প্যারালেল প্রোগ্রাম লিখছি। এটি কখনই সহজ নয়, প্রত্যেকটির পক্ষে খুব সাবধানী চিন্তাভাবনা প্রয়োজন, এবং যে কেউ "ইজ্ট জাস্ট ডু এক্স" বলে সে একজন বোকা, যা সত্যিই বুঝতে পারে না যা চলছে। শুভকামনা।
দ্রুত_ এখন 25:58

2
আপনি যদি সম্মতিটি দেখতে চান তবে ভালভাবে ব্যবহার করুন ইরং! সত্যিকার অর্থে আপনি যা চান তা হ'ল একটি ভাগ করা কিছুই অভিনেতার মডেল যেখানে অদ্ভুত কোণার কেসগুলি মুছে ফেলা হচ্ছে।
জাচারি কে

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

উত্তর:


27

আপনার কোডটিতে উল্লেখযোগ্য অন্যান্য সমস্যা রয়েছে যা কেবলমাত্র from ম্যানুয়ালি পয়েন্টার মোছা হচ্ছে? একটি cleanupফাংশন কল ? Owch। এছাড়াও, প্রশ্ন মন্তব্যে যথাযথভাবে নির্দেশিত হিসাবে, আপনি আপনার লকের জন্য আরআইআইআই ব্যবহার করবেন না, এটি অন্য একটি মোটামুটি মহাকাব্য ব্যর্থ এবং গ্যারান্টি দেয় যে যখন DoSomethingImportantকোনও ব্যতিক্রম ছোঁড়ে তখন ভয়ানক জিনিস ঘটে যায়।

এই বহুবিবাহিত ত্রুটিটি ঘটছে এটি মূল সমস্যার লক্ষণ-আপনার কোডটিতে কোনও থ্রেডিং পরিস্থিতিতে অত্যন্ত খারাপ শব্দার্থবিদ্যা রয়েছে এবং আপনি সম্পূর্ণ অবিশ্বাস্য সরঞ্জাম এবং প্রাক্তন-প্রতিমা ব্যবহার করছেন। আমি যদি আপনি ছিলাম, আমি অবাক হব যে এটি একক থ্রেডের সাথে কাজ করে, আরও কিছু ছেড়ে দিন।

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

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

ব্যবহার std::shared_ptr। যখন সমস্ত থ্রেড প্রকাশিত হয়েছে (এবং তাই কেউই ফাংশনটি কল করতে পারে না, কারণ তাদের কোনও পয়েন্টার নেই), তখন ধ্বংসকারীকে ডাকা হয়। এটি নিরাপদে গ্যারান্টিযুক্ত।

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


এটি একটি ঠিক উত্তর, তবে আমি যে দিকটি সন্ধান করছিলাম তা নয়, কারণ এটি কেবলমাত্র সরলতার জন্য (এবং আমাদের পণ্যটিতে আমাদের আসল কোডটির প্রতিচ্ছবি নয়) একটি নমুনা কোডের টুকরো মূল্যায়ন করতে অনেক সময় ব্যয় করে। তবে আপনি যে মন্তব্য করেছেন তার সম্পর্কে আমি আগ্রহী - "অবিশ্বাস্য সরঞ্জাম"। অবিশ্বাস্য সরঞ্জাম কী? আপনি কি সরঞ্জামের পরামর্শ দিচ্ছেন?
কনকুরেন্সি

5
@ কনকুরেন্সি: একটি অবিশ্বাস্য সরঞ্জাম হ'ল ম্যানুয়াল মেমোরি পরিচালনা বা আপনার নিজস্ব সিঙ্ক্রোনাইজেশন লেখার মতো জিনিস যেখানে তাত্ত্বিকভাবে এটি একটি সমস্যা সমাধান করে তবে বাস্তবে এতটাই খারাপ যে আপনি সম্ভবত বিশাল সমস্যাগুলির গ্যারান্টি দিতে পারেন এবং এটিই সম্ভবত সমস্যার সমাধান করার একমাত্র উপায় guarantee যুক্তিসঙ্গত স্কেলটি হ'ল বিকাশকারীদের সময়কালীন প্রচুর এবং অসমর্থনযুক্ত বিনিয়োগ - যা আপনার কাছে এখন now
ডেড এমজি

9

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

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

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

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

আবার, আমি যা বর্ণনা করছি তা জিনিস করার সঠিক উপায় নয়, তবে এটি এমন একটি প্রক্রিয়া যা আপনাকে বাণিজ্যিক বর্ধিত সময়সীমার সাথে সামঞ্জস্য করার পক্ষে যথেষ্ট পরিমাণে বর্ধনের ক্ষেত্রে সঠিক পথে পরিচালিত করতে পারে।


বিদ্যমান চ্যালেঞ্জটি পাওয়ার বিষয়ে যুক্তিসঙ্গত, মধ্যবর্তী পরামর্শের জন্য +1।

হ্যাঁ, আমি এই পদ্ধতিটি অনুসন্ধান করছি। আপনি অভিনয় সম্পর্কে ভাল পয়েন্ট উত্থাপন।
কনকুরেন্সি

একক প্রেরণের থ্রেডে যাওয়ার জন্য জিনিসগুলি পরিবর্তন করা আমার কাছে দ্রুত প্যাচের মতো শোনাচ্ছে না বরং এটি আমার কাছে একটি বিশাল চুল্লী।
সেবাস্তিয়ান রেডল

8

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

আপনি কোডটি পুনরায় কাজ করার সময় আপনার কোডটি লেখার পরিকল্পনা করা উচিত যাতে এটি কার্যকরভাবে সঠিক হয়। যদি আপনি এটি করতে না জানেন তবে এমন কাউকে খুঁজে নিন যিনি করেন বা আপনি একই জায়গায় এসেছেন।


আমার উত্তরটি উত্সাহিত হওয়ার পরে এটি এখনই পড়ুন। শুধু বলতে চাই যে আমি চেয়েছিলেন ভালবাসেন পরিচায়ক বাক্য :)
back2dos

7

আপনার অ্যাপ্লিকেশনটিকে রিফ্যাক্টরিং করার জন্য যদি আপনার উত্সর্গ করার কিছু সময় থাকে তবে আমি আপনাকে অভিনেতার মডেলটি একবার দেখার পরামর্শ দিই (উদাহরণস্বরূপ থেরন , ক্যাসাব্ল্যাঙ্কা , লিব্প্প্প্প , সি ++ বাস্তবায়নের জন্য সিএএফ )।

অভিনেতা এমন বস্তু যা একযোগে চলতে থাকে এবং কেবল অ্যাসিক্রোনাস বার্তা বিনিময় ব্যবহার করে একে অপরের সাথে যোগাযোগ করে। সুতরাং, থ্রেড ম্যানেজমেন্ট, মুটেক্সেস, ডেডলকস ইত্যাদির সমস্ত সমস্যা একজন অভিনেতা বাস্তবায়ন গ্রন্থাগারের দ্বারা পরিচালিত হয় এবং আপনি আপনার অবজেক্টস (অভিনেতা) এর আচরণ বাস্তবায়নে মনোনিবেশ করতে পারেন, যা লুপটি পুনরাবৃত্তি করতে ফোটায় down

  1. বার্তা গ্রহণ করুন
  2. গণনা সম্পাদন করুন
  3. বার্তা (গুলি) প্রেরণ / তৈরি / অন্যান্য অভিনেতা হত্যা।

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

আমি কয়েক মাস ধরে আমার একটি প্রকল্পে এই মডেলটি (একটি সরল সংস্করণ) ব্যবহার করছি এবং এটি কতটা শক্তিশালী তা দেখে আমি অবাক হয়েছি।


1
স্কালার জন্য আক্কা লাইব্রেরি এটির একটি দুর্দান্ত বাস্তবায়ন যা বাচ্চারা মারা গেলে বা তার বিপরীতে পিতামাতার অভিনেতাদের কীভাবে হত্যা করা যায় সে সম্পর্কে অনেক কিছু চিন্তা করে। আমি জানি এটি সি ++ নয়, তবে দেখার মতো মূল্য রয়েছে: আক্কা.ইও
গ্লেনপিটারসন

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

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

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

ডাউনওয়োটার দয়া করে কোনও মন্তব্য রেখে পরামর্শ দিতে পারেন কীভাবে আমি এই উত্তরটি উন্নত করতে পারি?
জর্জিও

6

সাধারণ ভুল # 1 - ভাগ করা ডেটার চারপাশে একটি লক রেখে সামঞ্জস্য ইস্যু ঠিক করা, তবে যখন পদ্ধতিগুলি প্রত্যাশিত ক্রমে ডাকা হয় না তখন কী ঘটে তা ভুলে যায়। এখানে একটি খুব সাধারণ উদাহরণ:

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

আপনার অভিনেতার মডেল / বার্তাকে একটি নির্দিষ্ট ডিগ্রীতে অভিযোজিত করার এবং উদ্বেগের পৃথকীকরণের চেষ্টা করা উচিত। এর ভূমিকা Fooস্পষ্টতই এক ধরণের HTTP যোগাযোগ পরিচালনা করা communication আপনি যদি আপনার সিস্টেমে সমান্তরালভাবে এটি করতে ডিজাইন করতে চান তবে এটি উপরে স্তর যা অবশ্যই অবজেক্ট লাইফসাইকেলগুলি পরিচালনা করতে হবে এবং সেই অনুযায়ী সিঙ্ক্রোনাইজেশন অ্যাক্সেস করতে হবে।

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


2

আপনার সমস্যাগুলি বেশ খারাপ, তবে সি ++ এর দুর্বল ব্যবহারের সাধারণ। কোড পর্যালোচনা এই সমস্যার কিছু সমাধান করবে। ৩০ মিনিট, চোখের বলের একটি সেট ফলাফলের 90% টিপ দেয় ((এর জন্য উদ্ধৃতিটি গুগলযোগ্য)

# 1 সমস্যা আপনার লকিং ডেডলকিং প্রতিরোধের জন্য আপনাকে অবশ্যই একটি কঠোর লক হায়ারচি রয়েছে তা নিশ্চিত করতে হবে।

আপনি যদি একটি মোড়ক এবং ম্যাক্রো দিয়ে অটলক প্রতিস্থাপন করেন তবে আপনি এটি করতে পারেন।

আপনার মোড়কের পিছনে তৈরি লকগুলির স্থির বৈশ্বিক মানচিত্র রাখুন। আপনি অটলক মোড়ক নির্মাণকারীর মধ্যে ফাইনেনাম এবং লাইন নম্বর তথ্য সন্নিবেশ করতে ম্যাক্রো ব্যবহার করেন।

আপনার একটি স্থিতিশীল আধিপত্য গ্রাফও প্রয়োজন হবে।

এখন তালাবন্ধের ভিতরে আপনাকে ডেমোমিকেটর গ্রাফটি আপডেট করতে হবে এবং আপনি যদি অর্ডারিং পরিবর্তন পান তবে আপনি একটি ত্রুটি যুক্ত করে রেখেছেন এবং বাতিল করতে পারেন।

ব্যাপক পরীক্ষার পরে আপনি বেশিরভাগ সুপ্ত ডেডলকগুলি থেকে মুক্তি পেতে পারেন।

কোডটি ছাত্রের অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।

সমস্যা # 2 এর পরে চলে যাবে (বেশিরভাগ)

আপনার প্রত্নতাত্ত্বিক সমাধান কাজ করতে চলেছে। আমি মিশন এবং লাইফ ক্রিটিকাল সিস্টেমে আগে এটি ব্যবহার করেছি। আমার গ্রহণ এটি এই

  • অপরিবর্তনীয় বস্তু পাস করুন বা পাস করার আগে সেগুলির অনুলিপি তৈরি করুন।
  • পাবলিক ভেরিয়েবল বা গেটারগুলির মাধ্যমে ডেটা ভাগ করবেন না।

  • বহিরাগত ইভেন্টগুলি একটি থ্রেড দ্বারা পরিবেষ্টিত একটি সারিতে বহুবিবাহিত প্রেরণের মাধ্যমে আসে। ইভেন্ট ইভেন্ট পরিচালনা সম্পর্কে এখন আপনি বাছাই করতে পারেন।

  • থ্রেডগুলি ক্রস করে এমন ডেটা পরিবর্তনগুলি একটি থ্রেড-সেফ কিউউতে আসে, একটি থ্রেড দ্বারা পরিচালিত হয়। সাবস্ক্রিপশন তৈরি করুন। এখন আপনি ডেটা প্রবাহ সম্পর্কে ধরণের কারণ বলতে পারেন।

  • যদি আপনার ডেটা ক্রস-টাউন যাওয়ার দরকার হয় তবে ডেটা কাতারে প্রকাশ করুন। এটি এটিকে অনুলিপি করে এবং সংশ্লেষক্রমে গ্রাহকদের কাছে পাঠিয়ে দেবে। প্রোগ্রামের সমস্ত ডেটা নির্ভরতাও ভেঙে দেয়।

এটি সস্তা অভিনেতার মডেল। জর্জিওর লিঙ্কগুলি সাহায্য করবে।

অবশেষে, শাট ডাউন জিনিসগুলির সাথে আপনার সমস্যা।

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


2

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

কেন্ট বিশ্ববিদ্যালয়ের একটি সি ++ বাস্তবায়ন রয়েছে ( https://www.cs.kent.ac.uk/projects/ofa/c++csp/ , https://github.com/themasterchef/cppcsp2 এ ক্লোন করা হয়েছে )।


1

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

আমি বর্তমানে এটি পড়ছি এবং এটি সি ++ এ (নতুন থ্রেডিং লাইব্রেরি ব্যবহার করে তবে আমি মনে করি যে বিশ্বব্যাপী ব্যাখ্যাগুলি আপনার ক্ষেত্রে কার্যকর আছে): HTTP: //www.amazon। কম / সি-concurrency-অ্যাকশান-প্রাকটিক্যাল-Multithreading / ডিপি / 1933988770 / ref & = sr_1_1? অর্থাত = UTF8 হওয়া & qid = 1337934534 & SR = 8-1

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

আমি ব্যক্তিগতভাবে একটি সরলীকৃত ইউএমএল ব্যবহার করি এবং কেবল ধরে নিই যে বার্তাগুলি সংশ্লেষজনকভাবে সম্পন্ন হয়েছে। এছাড়াও, "মডিউল" এর মধ্যে এটি সত্য তবে মডিউলগুলির মধ্যে আমি জানতে চাই না।

মাল্টিথ্রেড কোড সহ আপনার বিকাশ দলকে শিক্ষিত করা।

বইটি সাহায্য করবে, তবে আমি মনে করি অনুশীলন / প্রোটোটাইপিং এবং অভিজ্ঞ পরামর্শদাতা ভাল হবেন।

আপনি কি করতে চান?

প্রকল্পে লোকেরা সমঝোতা সমস্যাগুলি বুঝতে না পেরে আমি এড়াতে চাই। তবে আমার ধারণা আপনি এটি করতে পারবেন না, সুতরাং আপনার নির্দিষ্ট ক্ষেত্রে, দল আরও শিক্ষিত হয়ে উঠবে তা নিশ্চিত করার চেষ্টা করা ছাড়া আমার কোনও ধারণা নেই।


বইয়ের পরামর্শের জন্য ধন্যবাদ। আমি সম্ভবত এটি নিতে হবে।
কনকুরেন্সি

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

@ গ্লেনপিটারসন সম্মত হয়েছেন, এখন আমার আরও অভিজ্ঞতা রয়েছে (যেহেতু এই উত্তর) আমি দেখতে পেয়েছি যে এটির ব্যবস্থাপনামূলক করতে এবং ভাগ করে নেওয়ার ডেটা নিরুৎসাহিত করার জন্য আমাদের আরও ভাল বিমূর্ততা প্রয়োজন। ভাগ্যক্রমে, ভাষা ডিজাইনাররা এতে কঠোর পরিশ্রম করছে বলে মনে হয়।
ক্লাইম

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

1

আপনি সমস্যাটি স্বীকার করে এবং সক্রিয়ভাবে সমাধানের সন্ধানের মাধ্যমে ইতিমধ্যে পথে রয়েছেন। আমি এখানে কি করব:

  • আপনার অ্যাপ্লিকেশনটির জন্য বসে থ্রেডিং মডেলটি ডিজাইন করুন। এটি এমন একটি দলিল যা প্রশ্নের উত্তর দেয়: আপনার কাছে কোন ধরণের থ্রেড রয়েছে? কোন থ্রেডে কি জিনিস করা উচিত? আপনার কোন ধরণের সিঙ্ক্রোনাইজেশন ধরণগুলি ব্যবহার করা উচিত? অন্য কথায়, মাল্ট্রিথ্রেডিং সমস্যার সাথে লড়াই করার সময় এটি "বাগদানের নিয়ম" বর্ণনা করা উচিত।
  • ত্রুটির জন্য আপনার কোডবেস পরীক্ষা করতে থ্রেড বিশ্লেষণ সরঞ্জামগুলি ব্যবহার করুন। ভালগ্রিন্ডের হেলগ্রিন্ড নামে একটি থ্রেড চেকার রয়েছে যা সঠিক সিঙ্ক্রোনাইজেশন ছাড়াই ভাগ করে নেওয়া অবস্থায় চালিত হওয়ার মতো জিনিসগুলিতে নজর দেওয়া ভাল। সেখানে অবশ্যই খুব ভাল অন্যান্য সরঞ্জাম রয়েছে, তাদের সন্ধান করুন।
  • সি ++ থেকে দূরে স্থানান্তর বিবেচনা করুন। সি ++ একযোগে প্রোগ্রাম লেখার জন্য একটি দুঃস্বপ্ন My আমার ব্যক্তিগত পছন্দটি এড়লং হবে , তবে এটি স্বাদের বিষয়।

8
শেষ বিট জন্য অবশ্যই -1। এটি প্রদর্শিত হবে যে ওপির কোডটি সর্বাধিক আদিম সরঞ্জামগুলি ব্যবহার করছে না প্রকৃত সি ++ সরঞ্জামগুলি।
ডেড এমজি

2
আমি রাজি নই। আপনি যদি সঠিক সি ++ প্রক্রিয়া এবং সরঞ্জাম ব্যবহার করেন তবে সি ++ এ কনকুরেন্সি একটি দুঃস্বপ্ন। এবং দয়া করে মনে রাখবেন যে আমি " বিবেচনা করুন " শব্দটি বেছে নিয়েছি । আমি পুরোপুরি বুঝতে পেরেছি যে এটি বাস্তবসম্মত বিকল্প নাও হতে পারে, তবে বিকল্পগুলি বিবেচনা না করে সি ++ এর সাথে থাকা কেবল সহজ নির্বোধ।
জেস্পেরি

4
@ জেস্পের - দুঃখিত, তবে না। সি ++ তে সচ্ছলতা কেবলমাত্র একটি দুঃস্বপ্ন তবে যদি আপনি খুব নিম্ন-স্তরে গিয়ে এটিকে তৈরি করেন। সঠিক থ্রেডিং বিমূর্ততা ব্যবহার করুন এবং এটি অন্য কোনও ভাষা বা রানটাইমের চেয়ে খারাপ নয়। এবং যথাযথ প্রয়োগ কাঠামোর সাথে, এটি আমার দেখা অন্য যে কোনও কিছুর তুলনায় বেশ সহজ।
মাইকেল কোহনে

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

1
@ জেস্পার: আমি আপনার সাথে একমত এরলং মডেল (যার জন্য স্কালা / জাভা, রুবি, এবং যতদূর আমি জানি, সি ++ এর জন্যও বাস্তবায়ন রয়েছে) সরাসরি থ্রেডের সাথে কোডিংয়ের চেয়ে অনেক বেশি শক্তিশালী।
জর্জিও

1

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

আপনি এই তর্কও করতে পারেন যে ফু :: শাটডাউন কল করার সময় কল করা উচিত নয়, যখন অনআউটএইচটিপিআরইউকাস্ট কমপ্লিটের কল চলছে (অবশ্যই সত্য) এবং যদি না এইচএনএইচটিপিআরকুইস্ট কমপ্লিটের কল এখনও অসামান্য থাকে।

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

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

আপনার যা করা দরকার: আপনার ফাংশনগুলিতে চশমা যুক্ত করুন ঠিক কী বলবেন তা। (উদাহরণস্বরূপ, শাটডাউন হেসে ডাকা হওয়ার পরে কোনও http অনুরোধ শুরু করা ব্যর্থ হতে পারে)। এবং তারপরে আপনার ফাংশনগুলি লিখুন যাতে তারা চশমাগুলি পূরণ করে।

লকগুলি ভাগ করা ভেরিয়েবলগুলির পরিবর্তন নিয়ন্ত্রণ করতে কেবলমাত্র সর্বনিম্নতম সময়ের জন্য সবচেয়ে ভাল ব্যবহৃত হয়। সুতরাং আপনার কাছে একটি পরিবর্তনশীল "পারফর্মিংশুটডাউন" থাকতে পারে যা একটি লক দ্বারা সুরক্ষিত।


0

আপনি কি করতে চান?

সত্যি বলতে; আমি দ্রুত পালাতে চাই

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

আপনি কীভাবে এটি করতে যাচ্ছেন ঠিক ("গ্লোবাল লক অর্ডার", অভিনেতা মডেল, ...) দিয়ে শুরু করে নকশার পর্যায়ে একযোগে সমস্যাগুলি এড়ানো শুরু করা দরকার। এটি এমন কিছু নয় যা আপনি এই আশায় উন্মাদ আতঙ্কের মধ্যে সমাধানের চেষ্টা করেছিলেন যে আসন্ন প্রকাশের পরে সবকিছু আত্ম-বিনষ্ট হবে না।

নোট করুন যে আমি এখানে ঠাট্টা করছি না। আপনার নিজের শব্দ (" এটির বেশিরভাগ উদ্ভূত অন্যান্য বিকাশকারীদের যারা দল ছেড়ে চলে গেছে তাদের থেকেই। আমি পরামর্শ দিচ্ছি।

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