রেফারেন্স অ্যাসাইনমেন্টটি পারমাণবিক তাই কেন ইন্টারলকড? এক্সচেঞ্জ (রেফ অবজেক্ট, অবজেক্ট) প্রয়োজন?


108

আমার মাল্টিথ্রেডেড এসএমএক্স ওয়েব পরিষেবাদিতে আমার নিজের টাইপ সিস্টেমডাটাতে একটি ক্লাস ফিল্ড _লডাটা ছিল যা কয়েকটি সমন্বিত List<T>এবং Dictionary<T>হিসাবে চিহ্নিত রয়েছে volatile। সিস্টেমের ডেটা ( _allData) একবারে রিফ্রেশ হয়ে যায় এবং আমি এটির নামে অন্য একটি অবজেক্ট তৈরি করে newDataনতুন ডেটা দিয়ে এর ডেটা স্ট্রাকচারগুলি পূরণ করে করি do এটি শেষ হয়ে গেলে আমি কেবল বরাদ্দ করি

private static volatile SystemData _allData

public static bool LoadAllSystemData()
{
    SystemData newData = new SystemData();
    /* fill newData with up-to-date data*/
     ...
    _allData = newData.
} 

এটি কাজ করা উচিত যেহেতু অ্যাসাইনমেন্টটি পারমাণবিক এবং যে থ্রেডগুলিতে পুরানো ডেটার রেফারেন্স রয়েছে তারা এটি ব্যবহার করে রাখে এবং বাকীগুলিকে অ্যাসাইনমেন্টের ঠিক পরে নতুন সিস্টেম ডেটা থাকে। তবে আমার কলেজটি বলেছিল যে volatileকীওয়ার্ড এবং সাধারণ অ্যাসিগমেন্টটি ব্যবহার না করে আমার ব্যবহার করা উচিত InterLocked.Exchangeকারণ তিনি বলেছিলেন যে কয়েকটি প্ল্যাটফর্মে রেফারেন্স অ্যাসাইনমেন্টটি পারমাণবিক বলে গ্যারান্টিযুক্ত হয় না। তাছাড়া যখন আমি ঘোষণা the _allDataযেমন ক্ষেত্রvolatile

Interlocked.Exchange<SystemData>(ref _allData, newData); 

সতর্কতা উত্পন্ন করে "একটি অস্থির ক্ষেত্রের রেফারেন্সকে অস্থির হিসাবে বিবেচনা করা হবে না" এই সম্পর্কে আমার কী ভাবা উচিত?

উত্তর:


179

এখানে অসংখ্য প্রশ্ন আছে। তাদের একবারে বিবেচনা করা:

রেফারেন্স অ্যাসাইনমেন্টটি পারমাণবিক তাই কেন ইন্টারলকড? এক্সচেঞ্জ (রেফ অবজেক্ট, অবজেক্ট) প্রয়োজন?

রেফারেন্স অ্যাসাইনমেন্টটি পারমাণবিক। ইন্টারলকড। এক্সচেঞ্জ কেবল রেফারেন্স অ্যাসাইনমেন্ট করে না। এটি একটি ভেরিয়েবলের বর্তমান মানের একটি পঠন করে, পুরাতন মানকে দূরে সরিয়ে দেয় এবং ভ্যারিয়েবলের কাছে নতুন মান নির্ধারণ করে, এটি সমস্তই পারমাণবিক ক্রিয়াকলাপ হিসাবে।

আমার সহকর্মী বলেছিলেন যে কয়েকটি প্ল্যাটফর্মে এটির নিশ্চয়তা নেই যে রেফারেন্স অ্যাসাইনমেন্টটি পারমাণবিক। আমার সহকর্মী কি সঠিক ছিল?

না। রেফারেন্স অ্যাসাইনমেন্টটি সমস্ত নেট নেট প্ল্যাটফর্মে পারমাণবিক হওয়ার গ্যারান্টিযুক্ত।

আমার সহকর্মী মিথ্যা প্রাঙ্গণ থেকে যুক্তিযুক্ত। তার মানে কি এই যে তাদের সিদ্ধান্তগুলি ভুল?

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

সতর্কতা উত্পন্ন করে "একটি অস্থির ক্ষেত্রের রেফারেন্সকে অস্থির হিসাবে বিবেচনা করা হবে না" এই সম্পর্কে আমার কী ভাবা উচিত?

সাধারণভাবে কেন এটি সমস্যা তা আপনার বুঝতে হবে। এই বিশেষ ক্ষেত্রে সতর্কবাণীটি কেন গুরুত্বহীন তা বোঝার দিকে পরিচালিত করবে।

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

(আমি ধরে নিলাম যে আপনি ইতিমধ্যে এটি সমস্ত কিছু বুঝতে পেরেছেন v ডান পেতে খুব কঠিন; আপনার প্রোগ্রামটি ঠিক আছে তা নিশ্চিত করুন কারণ আপনি বুঝতে পারেন যে এটি কীভাবে কাজ করে, দুর্ঘটনার দ্বারা সঠিক নয়))

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

অতএব, সংকলক আপনি যখন এটি করবেন তখন সতর্ক করে, কারণ এটি সম্ভবত আপনার সাবধানতার সাথে বিকাশযুক্ত লক-মুক্ত যুক্তিটিকে পুরোপুরি জড়িয়ে ফেলবে।

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


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

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

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

2
@ এরিকলিপার্ট "মাল্টিথ্রেডিং ব্যবহার করবেন না" এবং "যদি আপনার অবশ্যই, পরিবর্তনীয় ডেটা স্ট্রাকচার ব্যবহার করুন" এর মধ্যে, আমি অন্তর্বর্তী এবং খুব সাধারণ স্তর ""োকাতে চাইলে একটি শিশু থ্রেড কেবলমাত্র মালিকানাধীন ইনপুট অবজেক্ট ব্যবহার করে এবং প্যারেন্ট থ্রেড ফলাফলগুলি গ্রাস করে শুধুমাত্র যখন শিশুটি শেষ হয় "। হিসাবে হিসাবে var myresult = await Task.Factory.CreateNew(() => MyWork(exclusivelyLocalStuffOrValueTypeOrCopy));
জন

1
@ জন: এটি একটি ভাল ধারণা। আমি সস্তা প্রসেসের মতো থ্রেডগুলি চিকিত্সার চেষ্টা করি: তারা সেখানে একটি কাজ করে ফলাফল তৈরি করে, মূল প্রোগ্রামের ডেটা স্ট্রাকচারের ভিতরে নিয়ন্ত্রণের দ্বিতীয় থ্রেড হিসাবে প্রায় দৌড়ে না যায়। তবে থ্রেডটি যে পরিমাণ কাজ করছে তা যদি এত বেশি হয় যে এটি একটি প্রক্রিয়ার মতো আচরণ করা যুক্তিসঙ্গত হয়, তবে আমি বলি কেবল এটিকে একটি প্রক্রিয়া করুন!
এরিক লিপার্ট

9

হয় আপনার কলেজটি ভুল হয়েছে, বা তিনি এমন কিছু জানেন যা সি # ভাষার নির্দিষ্টকরণের নয়।

5.5 পরিবর্তনশীল উল্লেখগুলির পারমাণবিকতা :

"নিম্নলিখিত ডেটা প্রকারগুলি পড়ুন এবং লেখাগুলি হ'ল পারমাণবিক: বুল, চর, বাইট, এসবিট, সংক্ষিপ্ত, ushort, uint, int, ভাসা এবং রেফারেন্স প্রকারগুলি" "

সুতরাং, আপনি কোনও দূষিত মান পাওয়ার ঝুঁকি ছাড়াই অস্থির রেফারেন্সে লিখতে পারেন।

কোন এক থ্রেডে একাধিক থ্রেড যে ঝুঁকিটি কমাতে পারে তা হ্রাস করার জন্য আপনার কী থ্রেডটি নতুন ডেটা আনবে সে বিষয়ে অবশ্যই অবশ্যই যত্নবান হওয়া উচিত।


3
@ গুফা: হ্যাঁ আমি এটিও পড়েছি। এটি আসল প্রশ্নটি ছেড়ে দেয় "রেফারেন্স অ্যাসাইনমেন্টটি পারমাণবিক তাই কেন ইন্টারলকড? এক্সচেঞ্জ (রেফার অবজেক্ট, অবজেক্ট) প্রয়োজন?" উত্তরহীন
চর এম

@ জেজব্রোবক্স: আপনার অর্থ কী? তারা কখন নেই? আপনি কি করতে চান?
চর এম

@ মট্টি: আপনাকে যখন পারমাণবিক ক্রিয়াকলাপ হিসাবে কোনও মান পড়তে এবং লিখতে হয় তখন এটি প্রয়োজন।
গুফা

.NET- এ সঠিকভাবে মেমরিটি সঠিকভাবে বিন্যস্ত না হওয়া নিয়ে আপনার কতবার চিন্তা করতে হবে? আন্তঃ ভারী জিনিস?
স্কুরমেডেল

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

6

ইন্টারলকড x এক্সচেঞ্জ <টি>

নির্দিষ্ট ধরণের টির একটি নির্দিষ্ট মানকে একটি ভেরিয়েবল সেট করে এবং পারমাণবিক ক্রিয়াকলাপ হিসাবে আসল মানটি প্রদান করে।

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

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


3

Iterlocked.Exchange() এটি কেবল পারমাণবিক নয়, এটি মেমরির দৃশ্যমানতার যত্নও করে:

নিম্নলিখিত সিঙ্ক্রোনাইজেশন ফাংশনগুলি মেমরি ক্রম নিশ্চিত করার জন্য উপযুক্ত বাধা ব্যবহার করে:

ক্রিয়াকলাপগুলি যা সমালোচনা বিভাগে প্রবেশ করে বা ছেড়ে দেয় leave

সিঙ্ক্রোনাইজেশন অবজেক্টগুলিকে সিগন্যাল করে এমন ক্রিয়াকলাপ

ফাংশন অপেক্ষা করুন

ইন্টারলকড ফাংশন

সিঙ্ক্রোনাইজেশন এবং মাল্টিপ্রসেসর ইস্যু

এর অর্থ হ'ল পারমাণবিকতা ছাড়াও এটি নিশ্চিত করে যে:

  • থ্রেড এটি কল করার জন্য:
    • নির্দেশাবলীর কোনও পুনরায় অর্ডারিং করা হয় না (সংকলক, রান-টাইম বা হার্ডওয়্যার দ্বারা)।
  • সমস্ত থ্রেডের জন্য:
    • এই নির্দেশের পূর্বে ঘটে যাওয়া মেমরির কোনও পাঠ্যই এই নির্দেশনাটির পরিবর্তনটি দেখতে পাবে না।
    • এই নির্দেশের পরে সমস্ত পড়া এই নির্দেশাবলীর দ্বারা পরিবর্তনগুলি দেখতে পাবেন।
    • এই নির্দেশের পরিবর্তনটি মূল স্মৃতিতে পৌঁছে যাওয়ার পরে এই নির্দেশের পরে সমস্তই মেমোরিতে লেখেন (এই নির্দেশনাটি মূল স্মৃতিতে পরিবর্তনের পরে এটি শেষ হয়ে যাওয়ার পরে এবং হার্ডওয়্যারটি এটির সময় অনুযায়ী নিজের উপর চাপ দিতে দেয় না)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.