যেসব ক্ষেত্রে পাঠ্য প্রচুর পরিমাণে বেশি পড়ে, বা (তবে ঘন ঘন) লেখাগুলি অ-সমবর্তী হয় , সেখানে অনুলিখনের অনুলিপিটি উপযুক্ত হতে পারে।
নীচে প্রদর্শিত বাস্তবায়ন হয়
- lockless
- একত্রে সাম্প্রতিক পরিবর্তনগুলি চলমান থাকা সত্ত্বেও সমকালীন পাঠগুলির জন্য নির্লজ্জভাবে দ্রুত - তারা যতক্ষণ সময় নেয় না কেন
- কারণ "স্ন্যাপশট" অপরিবর্তনীয়, লকলেস পারমাণবিকতা সম্ভব, অর্থাত্
var snap = _list; snap[snap.Count - 1];
কখনই হবে না (ভাল, অবশ্যই একটি খালি তালিকা বাদে) নিক্ষেপ করবে এবং আপনি স্ন্যাপশট সিনটিক্সের সাথে বিনামূল্যে থ্রেড-নিরাপদ গণনাও পাবেন .. আমি কীভাবে অপরিবর্তনীয়তা ভালবাসি!
- জেনেরিক বাস্তবায়িত করার জন্য প্রযোজ্য কোনো ডাটা স্ট্রাকচার এবং পরিমার্জন কোন ধরনের
- মৃত সরল , অর্থাত্ পরীক্ষা করে নেওয়া সহজ, ডিবাগ করা, কোডটি পড়ে যাচাই করা
- নেট নেট 3.5 এ ব্যবহারযোগ্য
কাজ করার জন্য অনুলিপি করার জন্য, আপনাকে আপনার ডেটা কাঠামো কার্যকরভাবে অপরিবর্তনীয় রাখতে হবে , অর্থাৎ অন্য থ্রেডগুলিতে উপলব্ধ করার পরে কাউকে এগুলি পরিবর্তন করার অনুমতি নেই। আপনি যখন পরিবর্তন করতে চান, আপনি
- কাঠামো ক্লোন করুন
- ক্লোন পরিবর্তন করুন
- পরিবর্তিত ক্লোনটির রেফারেন্সে পরমাণুগতভাবে অদলবদল করুন
কোড
static class CopyOnWriteSwapper
{
public static void Swap<T>(ref T obj, Func<T, T> cloner, Action<T> op)
where T : class
{
while (true)
{
var objBefore = Volatile.Read(ref obj);
var newObj = cloner(objBefore);
op(newObj);
if (Interlocked.CompareExchange(ref obj, newObj, objBefore) == objBefore)
return;
}
}
}
ব্যবহার
CopyOnWriteSwapper.Swap(ref _myList,
orig => new List<string>(orig),
clone => clone.Add("asdf"));
আপনি আরো কর্মক্ষমতা প্রয়োজন হলে, এটা পদ্ধতি ungenerify করতে, যেমন পরিমার্জন প্রতি টাইপ জন্য এক পদ্ধতি তৈরি করতে সাহায্য করবে (সরান যোগ করুন,, ...) আপনি চান, এবং হার্ড কোড ফাংশন পয়েন্টার cloner
এবং op
।
এনবি # 1 এটি নিশ্চিত করা আপনার দায়িত্ব যে কেউই (অনুমিত) অপরিবর্তনীয় ডেটা কাঠামো পরিবর্তন করে না। এটি রোধ করার জন্য আমরা জেনেরিক প্রয়োগে কিছুই করতে পারি না , তবে বিশেষীকরণের সময় List<T>
আপনি তালিকাটি ব্যবহার করে সংশোধন থেকে রক্ষা করতে পারেন sএসরেডঅনলি ()
এনবি # 2 তালিকার মানগুলি সম্পর্কে সতর্ক থাকুন। উপরের লেখার পদ্ধতির অনুলিপিটি কেবল তাদের তালিকার সদস্যতা রক্ষা করে তবে আপনি যদি স্ট্রিং না রাখেন তবে সেখানে কিছু পরিবর্তনীয় জিনিস রাখেন তবে আপনাকে থ্রেড সুরক্ষার যত্ন নিতে হবে (যেমন লকিং)। তবে এটি এই সমাধানের অর্থেগোনাল এবং উদাহরণস্বরূপ পরিবর্তিত মানগুলি লক করা ইস্যু ছাড়াই সহজেই ব্যবহার করা যেতে পারে। আপনার এটি সম্পর্কে সচেতন হওয়া দরকার।
এনবি # 3 যদি আপনার ডেটা কাঠামো বিশাল হয় এবং আপনি এটি প্রায়শই সংশোধন করেন তবে অনুলিপি-অনুলিখনের পদ্ধতি মেমরির ব্যবহার এবং জড়িত সিপিইউয়ের সাথে জড়িত উভয় ক্ষেত্রেই নিষিদ্ধ হতে পারে। সেক্ষেত্রে আপনি এমএসের অপরিবর্তনীয় সংগ্রহগুলি ব্যবহার করতে চাইতে পারেন ।