মেমরি পরিচালিত ভাষার জন্য একটি রেফারেন্স গণনা প্যাটার্ন?


11

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

আধুনিক সি ++ এ আপনি একটি দিয়ে এই সমস্যাটি সমাধান করবেন shared_ptr, যা সমস্ত shared_ptrধ্বংস হয়ে যাওয়ার পরে সংস্থানটি সংস্থানীয়ভাবে ছেড়ে দেবে ।

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



1
@ জোশক্যাসওয়েল হ্যাঁ, এবং এটি সমস্যার সমাধান করবে, তবে আমি আবর্জনা সংগ্রহের জায়গায় কাজ করছি।
সি রস

8
রেফারেন্স কাউন্টিং হয় একটি বর্জ্য সংগ্রহ কৌশল।
J:01rg ডব্লু মিটাগ

উত্তর:


15

সাধারণভাবে, আপনি এটিকে একক মালিক - এমনকি নিয়ন্ত্রণহীন ভাষায় রেখে এড়াতে পারেন।

তবে পরিচালিত ভাষার ক্ষেত্রে নীতিটি একই। আপনার অবিলম্বে ব্যয়বহুল সংস্থানটি বন্ধ করার পরিবর্তে Close()আপনি একটি কাউন্টারকে কমিয়ে আনুন ( Open()/ Connect()/ ইত্যাদিতে বর্ধিত ) যতক্ষণ না আপনি 0 টি আঘাত করেন যতক্ষণ না নিকটে প্রকৃতপক্ষে বন্ধ হয়। এটি সম্ভবত ফ্লাইওয়েট প্যাটার্নটির মতো দেখতে এবং কাজ করবে।


আমি যা ভাবছিলাম এটিই তবে এটির জন্য কোনও নথিভুক্ত প্যাটার্ন রয়েছে কি? ফ্লাইওয়েট অবশ্যই সমান, তবে বিশেষত মেমরির ক্ষেত্রে এটি সাধারণত সংজ্ঞায়িত হয়।
সি। রস

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

11
যে finalizers ব্যতীত @Panzercrisis চালানোর জন্য নিশ্চিত করা হয় না, বিশেষ করে চালানোর জন্য নিশ্চিত নয় অবিলম্বে
ক্লেথ

@ ক্যালথ আমি ভাবছিলাম যে গণনাগুলি তাড়াতাড়ি অংশে সহায়তা করবে। যতক্ষণ না এগুলি চালাচ্ছে না, আপনি কি বোঝাতে চেয়েছেন যে সিএলআর কেবল প্রোগ্রামটি শেষ হওয়ার আগেই এটির কাছাকাছি পৌঁছেছে না, বা আপনি কি বোঝাতে চেয়েছেন যে তারা সরাসরি অযোগ্য ঘোষণা করতে পারেন?
Panzercrisis


14

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

"রিসোর্সের মালিকানা" ধারণাটি আসলে একটি জিসি ভাষায় প্রয়োগ হয় না। জিসি সিস্টেম সমস্ত বস্তুর মালিক।

এই ভাষাগুলি হ'ল রিসোর্স + ক্লোজেবল (জাভা), স্টেটমেন্ট + আইডিস্পোজেবল (সি #) ব্যবহার করে বা স্টেটমেন্ট + কনটেক্সট ম্যানেজার (পাইথন) দিয়ে কী প্রস্তাব দেয় কোনও সংস্থান নিয়ন্ত্রণের জন্য নিয়ন্ত্রণ প্রবাহের (! = অবজেক্ট) উপায় নিয়ন্ত্রণ প্রবাহ যখন একটি সুযোগ ছেড়ে যায় তখন বন্ধ হয়ে যায়। এই সমস্ত ক্ষেত্রে এটি স্বয়ংক্রিয়ভাবে inোকানো সমান try { ... } finally { resource.close(); }। উত্সটির প্রতিনিধিত্বকারী অবজেক্টের আজীবন সম্পদের জীবদ্দশার সাথে সম্পর্কিত নয়: উত্সটি বন্ধ হওয়ার পরে অবজেক্টটি বেঁচে থাকতে পারে এবং রিসোর্সটি এখনও উন্মুক্ত থাকা অবস্থায় অবজেক্টটি অ্যাক্সেসযোগ্য হতে পারে।

স্থানীয় ভেরিয়েবলের ক্ষেত্রে, এই পদ্ধতিগুলি RAII এর সমতুল্য, তবে কল সাইটে স্পষ্টভাবে ব্যবহার করা দরকার (সি ++ ডিস্ট্রাক্টরের বিপরীতে যা ডিফল্টরূপে চলবে)। এটি বাদ দিলে একটি ভাল আইডিই সতর্ক করবে।

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

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

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


3

অন্যান্য উত্তর থেকে প্রচুর ভাল তথ্য।

তবুও, স্পষ্ট করে বলতে গেলে, আপনি যে প্যাটার্নটির সন্ধান করতে পারেন তা হ'ল আপনি RAII- এর মতো নিয়ন্ত্রণ প্রবাহের জন্য usingএবং IDisposeএক (বৃহত্তর, সম্ভবত রেফারেন্স গণনা করা) অবজেক্টের সাথে মিলিয়ে কিছু (অপারেটিং) সাথে একত্রে মালিকানাধীন ছোট ছোট অবজেক্ট ব্যবহার করেন সিস্টেম) সংস্থানসমূহ।

সুতরাং ছোট ছোট ভাগ করা একক মালিকের অবজেক্ট রয়েছে যা (ছোট অবজেক্ট IDisposeএবং usingনিয়ন্ত্রণ প্রবাহের মাধ্যমে) বড় আকারের ভাগ করা অবজেক্টকে (সম্ভবত কাস্টম Acquireএবং Releaseপদ্ধতিগুলি) অবহিত করতে পারে ।

( নীচে দেখানো পদ্ধতি Acquireএবং Releaseপদ্ধতিগুলি ব্যবহারের নির্মাণের বাইরেও পাওয়া যায় তবে tryঅন্তর্নিহিতদের সুরক্ষা ব্যতীত using))


সি # তে একটি উদাহরণ

void Test ( MyRefCountedClass myObj )
{
    using ( var usingRef = myObj.Acquire () )
    {
        var item = usingRef.Item;
        item.SomeMethod ();

        // the `using` automatically invokes Dispose() on usingRef
        //  which in turn invokes Release() on `myObj.
    }
}

interface IReferencable<T> where T: IReferencable<T> {
    Reference<T> Acquire ();
    void Release();
}

struct Reference<T>: IDisposable where T: IReferencable<T>
{
    public readonly T Item;
    public Reference(T item) { Item = item; _released = false; }
    public void Dispose() { if (! _released ) { _released = true; Item.Release(); } }
    private bool _released;
}

class MyRefCountedClass : IReferencable<MyRefCountedClass>
{
    private int _refCount = 0;

    public Reference<MyRefCountedClass> Acquire ()
    {
        _refCount++;
        return new Reference<MyRefCountedClass>(this);
    }

    public void Release ()
    {
        if (--_refCount <= 0)
            Dispose();
    }

    // NOTE that MyRefCountedClass does not have to implement IDisposable, but it can...
    // as shown here it doesn't implement the interface
    private void Dispose ()  
    {
        if ( _refCount > 0 )
            throw new Exception ("Dispose attempted on item in use.");
        // release other resources...
    }

    public int SomeMethod()
    {
        return 0;
    }
}

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

@ ভু, ওকে, ভাল পয়েন্ট, থেক্স!
এরিক tদ

1

একটি সিস্টেমে বিশাল আকারের অবজেক্টের সাধারণত তিনটি ধরণের একটি মাপসই করা উচিত:

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

  2. যে বিষয়গুলি একক সত্তার একচেটিয়া নিয়ন্ত্রণাধীন, যা সেখানে সমস্ত রাজ্যের একমাত্র মালিক এবং বস্তুটি বিশুদ্ধরূপে সেখানে (সম্ভবত পরিবর্তনীয়) রাষ্ট্রকে আবদ্ধ করার উপায় হিসাবে ব্যবহার করে।

  3. যে বিষয়গুলি একক সত্তার মালিকানাধীন, তবে অন্যান্য সত্তাগুলি সীমিত উপায়ে ব্যবহারের অনুমতিপ্রাপ্ত। অবজেক্টের মালিক এটিকে কেবল এনক্যাপসুলেটিং স্টেটের মাধ্যম হিসাবেই ব্যবহার করতে পারে না, তবে এটি ভাগ করে নেওয়া অন্যান্য সত্তার সাথে সম্পর্ক আবদ্ধ করতে পারে।

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

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


0

ভাগ করা মালিকানা খুব কমই সংবেদন করে

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

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

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

রিসোর্স লিক

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

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

সুতরাং আমি কখনই জিসি বা রেফারেন্স গণনার কোনও বিশাল অনুরাগী হইনি কারণ কোনও ফাঁকা সফ্টওয়্যার তৈরি করতে তারা এটিকে কতটা সহজ করেছিল of এর আগে কী এমন ঝুঁকিপূর্ণ পয়েন্টার ক্র্যাশ হত যা খুব কঠিন সনাক্তকরণের রিসোর্সের ফাঁকে পরিণত হয় যা সহজেই পরীক্ষার রাডারের নিচে উড়তে পারে detect

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

সমাধান: স্থগিত, পর্যায়ক্রমিক অপসারণ

সুতরাং আমার সমাধানটি পরে যা আমি আমার ব্যক্তিগত প্রকল্পগুলিতে প্রয়োগ করেছিলাম যা আমাকে উভয় পৃথিবীর কাছ থেকে পাওয়া সেরা ধরণের ধারণা দিয়েছে তা হল এই ধারণাটি দূর করা referencing=ownershipকিন্তু এখনও সম্পদের ধ্বংস স্থগিত করা হয়েছে।

ফলস্বরূপ, এখন যখনই ব্যবহারকারী এমন কিছু করেন যার ফলে কোনও উত্স অপসারণের প্রয়োজন হয়, কেবলমাত্র সংস্থানটি সরানোর ক্ষেত্রে এপিআই প্রকাশ করা হয়:

ecs->remove(component);

... যা খুব সোজা উপায়ে ব্যবহারকারীর শেষ যুক্তিকে মডেল করে। তবে, যদি তাদের প্রক্রিয়াজাতকরণের পর্যায়ে অন্যান্য সিস্টেমে থ্রেড থাকে যেখানে তারা একই উপাদান একই সাথে অ্যাক্সেস করতে পারে তবে এখনই উত্স (উপাদান) এখনই সরানো যাবে না।

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

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

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

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