অস্থায়ী বনাম ইন্টারলক বনাম লক


670

ধরা যাক যে একটি শ্রেণীর একটি public int counterক্ষেত্র রয়েছে যা একাধিক থ্রেড দ্বারা অ্যাক্সেস করা হয়। এটি intকেবল বর্ধিত বা হ্রাসযোগ্য।

এই ক্ষেত্রটি বাড়ানোর জন্য, কোন পদ্ধতির ব্যবহার করা উচিত এবং কেন?

  • lock(this.locker) this.counter++;,
  • Interlocked.Increment(ref this.counter);,
  • অ্যাক্সেস পরিবর্তক পরিবর্তন counterকরতে public volatile

এখন যে আমি আবিষ্কার করেছি volatile, আমি অনেক lockবিবৃতি এবং ব্যবহারগুলি সরিয়ে দিচ্ছি Interlocked। কিন্তু এটি না করার কোনও কারণ আছে কি?


সি # রেফারেন্সে থ্রেডিং পড়ুন । এটি আপনার প্রশ্নের ইনস এবং আউটসকে কভার করে। তিনটির প্রত্যেকেরই আলাদা আলাদা উদ্দেশ্য এবং পার্শ্ব প্রতিক্রিয়া রয়েছে।
স্পোলসন

1
সরল- talk.com/blogs/2012/01/24/… আপনি অ্যারেতে ভোল্টেবলের ব্যবহার দেখতে পাচ্ছেন, আমি এটি পুরোপুরি বুঝতে পারি না, তবে এটি কী করে তার পূর্বসূত্র।
ইরান otzap

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

1
আমার বাড়িতে দুটি স্প্রিংকার এবং ধূমপানের এলার্ম রয়েছে। একটি থ্রেডে কাউন্টার বাড়ানোর সময় এবং অন্যটিতে পড়ার সময় মনে হয় আপনার একটি লক (বা একটি ইন্টারলকযুক্ত) এবং উদ্বায়ী কীওয়ার্ড উভয়েরই দরকার । সত্য?
yoyo

2
@ ইয়য়ো না, আপনার দুজনেরই দরকার নেই।
ডেভিড শোয়ার্জ

উত্তর:


858

সবচেয়ে খারাপ (আসলে কাজ করবে না)

অ্যাক্সেস পরিবর্তক পরিবর্তন counterকরতেpublic volatile

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

যদি হয় না হয় volatile এবং সিপিইউ এ একটি মান বাড়িয়ে দেয়, তবে সিপিইউ বি প্রকৃতপক্ষে কিছু সময়ের পরে সেই বর্ধিত মানটি নাও দেখতে পারে যা সমস্যার কারণ হতে পারে।

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

দ্বিতীয় সেরা:

lock(this.locker) this.counter++;

এটি করা নিরাপদ (যদি আপনি lockঅন্য যে কোনও জায়গায় অ্যাক্সেস করেন তবে মনে রাখবেনthis.counter ) এটি সুরক্ষিত অন্য কোনও কোড কার্যকর করতে অন্য কোনও থ্রেডকে বাধা দেয় locker। লকগুলিও ব্যবহার করে, মাল্টি-সিপিইউ পুনর্নির্মাণ সমস্যাটিকে উপরের মতো প্রতিরোধ করে, যা দুর্দান্ত।

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

সেরা

Interlocked.Increment(ref this.counter);

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

আমি সম্পূর্ণরূপে নিশ্চিত নই যদিও এটি অন্যান্য সিপিইউগুলিকে পুনঃক্রম করার জিনিসগুলি ঘিরে যদি হয়, বা আপনার যদি বর্ধনের সাথে অস্থির সমন্বয় করতে হয় তবে।

InterlockedNotes:

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

পাদটীকা: অস্থির কি জন্য আসলে ভাল।

যেহেতু volatileএই জাতীয় মাল্টিথ্রেডিং সমস্যাগুলি প্রতিরোধ করে না, এটি কিসের জন্য? একটি ভাল উদাহরণ বলছে যে আপনার দুটি থ্রেড রয়েছে, একটি যা সর্বদা একটি চলককে লেখেন (বলুনqueueLength ) এবং একটি যা সর্বদা একই চলক থেকে পড়ে reads

যদি queueLengthঅস্থির না হয় তবে থ্রেড এ পাঁচ বার লিখতে পারে তবে থ্রেড বি এই লেখাগুলি বিলম্বিত হতে পারে (বা এমনকি সম্ভাব্যভাবে ভুল ক্রমেও) দেখতে পাবে।

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


29
"আমি পুরোপুরি নিশ্চিত নই ... যদি আপনারও বর্ধনের সাথে অস্থিরতা একত্রিত করতে হয়।" এএফআইকে তাদের একত্রিত করা যায় না, কারণ আমরা রেফের মাধ্যমে অস্থিরতা পার করতে পারি না। উপায় দ্বারা দুর্দান্ত উত্তর।
হোসাম অলি

41
থ্যাঙ্কস অনেক! "কী অস্থির জন্য আসলে ভাল" এর উপরের আপনার পাদটিকাটি আমি যা খুঁজছিলাম এবং নিশ্চিত করেছিলাম যে আমি কীভাবে অস্থির ব্যবহার করতে চাই।
জ্যাক বোশ

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

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

19
@ জ্যাচসও: সি # এর একটি অস্থির ক্ষেত্র সি # সংকলক এবং জিট সংকলককে নির্দিষ্ট অপ্টিমাইজেশান তৈরি করতে বাধা দেয় যা মানটিকে ক্যাশে করে। এটি অর্ডার কী পড়বে এবং কী লিখবে সে সম্পর্কে একাধিক থ্রেডে লক্ষ্য করা যেতে পারে তারও নির্দিষ্ট গ্যারান্টি দেয়। বাস্তবায়নের বিশদ হিসাবে এটি পড়তে এবং লেখার ক্ষেত্রে মেমরির বাধাগুলি প্রবর্তন করে এটি করতে পারে। সুনির্দিষ্ট নিশ্চিত শব্দার্থবিজ্ঞানের বিবরণ বর্ণিত হয়েছে; নোট করুন যে স্পেসিফিকেশনটি গ্যারান্টি দেয় না যে সমস্ত অস্থির লেখাগুলি এবং পড়ার ধারাবাহিক ক্রমটি সমস্ত থ্রেড দ্বারা পর্যবেক্ষণ করা হবে
এরিক লিপার্ট

147

সম্পাদনা: মন্তব্যে উল্লিখিত হিসাবে, আজকাল আমি একক ভেরিয়েবলের ক্ষেত্রে এটি স্পষ্টতই ঠিক আছে যেখানে ব্যবহারের Interlockedজন্য খুশি । যখন এটি আরও জটিল হয়ে যায়, আমি তখনও লকিংয়ে ফিরে যাব ...

volatileআপনার যখন বর্ধন প্রয়োজন তখন ব্যবহার করা সাহায্য করবে না - কারণ পঠন এবং লিখন পৃথক নির্দেশাবলী। আরেকটি থ্রেড আপনি পড়ার পরে মানটি পরিবর্তন করতে পারে তবে আপনি ফিরে আসার আগে।

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


16
এখন থেকে লক-ফ্রি কোডিং সম্পর্কে আমাকে ভুলে যেতে নিশ্চিত করার জন্য +1।
Xaqron

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

2
ইন্টারলকডে কোনও সমস্যা নেই, এটি সম্পূর্ণ লক () এর চেয়ে আপনার সন্ধানী এবং দ্রুত যা হ'ল
জাপ

5
@Jaap: হ্যাঁ, এই দিন আমি চাই একটি প্রকৃত একক কাউন্টারের জন্য interlocked ব্যবহার। আমি কেবল ভেরিয়েবলগুলিতে একাধিক লক-মুক্ত আপডেটের মধ্যে মিথস্ক্রিয়াটি কার্যকর করার চেষ্টা করে গোলযোগ শুরু করতে চাই না ।
জন স্কিটি

6
@ জ্যাচসও: আপনার দ্বিতীয় মন্তব্যটি বলে যে কোনও পর্যায়ে ইন্টারলকড অপারেশন "লক" রয়েছে; "লক" শব্দটি সাধারণত বোঝায় যে একটি কাজ একটি সীমাহীন দৈর্ঘ্যের জন্য কোনও সংস্থার একচেটিয়া নিয়ন্ত্রণ বজায় রাখতে পারে; লক-ফ্রি প্রোগ্রামিংয়ের প্রাথমিক সুবিধাটি হ'ল মালিকানাধীন টাস্কের মালিকানা অর্জনের ফলে সংস্থানটি অকেজো হয়ে যাওয়ার ঝুঁকি এড়ানো যায়। ইন্টারলকড শ্রেণীর দ্বারা ব্যবহৃত বাস সিঙ্ক্রোনাইজেশন কেবল "সাধারণভাবে দ্রুত" নয় - বেশিরভাগ সিস্টেমে এটির সীমাবদ্ধতম সময় সবচেয়ে খারাপ থাকে, যেখানে লকগুলি হয় না।
সুপারক্যাট

44

" volatile" প্রতিস্থাপন করে না Interlocked.Increment! এটি কেবল নিশ্চিত করে যে পরিবর্তনশীলটি ক্যাশে করা হয়নি, তবে সরাসরি ব্যবহার করা হয়েছে।

ভেরিয়েবল বৃদ্ধির জন্য আসলে তিনটি অপারেশন প্রয়োজন:

  1. পড়া
  2. বৃদ্ধি
  3. লেখার

Interlocked.Increment তিনটি অংশই একক পারমাণবিক অপারেশন হিসাবে সম্পাদন করে।


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

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

42

লক বা ইন্টারলকযুক্ত বৃদ্ধি হ'ল আপনি যা সন্ধান করছেন।

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

যেমন

while (m_Var)
{ }

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

ইন্টারলকড ইনক্রিমেন্টের সাথে, প্রসেসরের বাইরে যেতে হবে, প্রদত্ত ঠিকানা থেকে মান আনতে হবে, তারপরে বৃদ্ধি এবং এটিকে আবার লিখতে হবে - পুরো ক্যাশে লাইনের একচেটিয়া মালিকানা থাকা অবস্থায় (লক এক্সএডিডি) অন্য কোনও প্রসেসর সংশোধন করতে পারে না তা নিশ্চিত করার জন্য all এর মান।

অস্থিরতার সাথে, আপনি এখনও কেবল 1 টি নির্দেশের সাথে শেষ করবেন (ধরে নিবেন জেআইটি যেমন করা উচিত তেমন দক্ষ) - inc dtr ptr [m_Var]। তবে প্রসেসর (সিপিইউ) ইন্টারলকড সংস্করণ দিয়ে যা করেছে তা করার সময় ক্যাশে লাইনের একচেটিয়া মালিকানার জন্য জিজ্ঞাসা করে না। আপনি কল্পনা করতে পারেন, এর অর্থ অন্যান্য প্রসেসরগুলি সিপিইউএ পড়ার পরে মি_ভারে একটি আপডেট মান লিখতে পারে। সুতরাং এখন দুটি বারের মান বাড়ানোর পরিবর্তে আপনি একবারে শেষ করবেন।

আশা করি এটি ইস্যুটি পরিষ্কার করে দেবে।

আরও তথ্যের জন্য, 'মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলিতে লো-লক কৌশলগুলির প্রভাব বুঝতে' দেখুন see http://msdn.microsoft.com/en-au/magazine/cc163715.aspx

পিএস এই খুব দেরী জবাব জিজ্ঞাসা? সমস্ত জবাবগুলি এত স্পষ্টতই ভুল ছিল (বিশেষত উত্তর হিসাবে চিহ্নিত হিসাবে) তাদের ব্যাখ্যাতে আমাকে কেবল এটি পড়ার জন্য কারও পক্ষে এটি পরিষ্কার করতে হয়েছিল।shrugs

পিপিএস আমি ধরে নিচ্ছি যে লক্ষ্যটি x86 / x64 এবং আইএ 64 নয় (এটির একটি ভিন্ন মেমরির মডেল রয়েছে)। নোট করুন যে মাইক্রোসফ্টের ইসিএমএ স্পেসগুলি এমনভাবে তৈরি হয়েছে যে এটি শক্তিশালীটির পরিবর্তে দুর্বলতম মেমরির মডেলটি নির্দিষ্ট করে (সর্বদা শক্তিশালী মেমরি মডেলের বিরুদ্ধে নির্দিষ্ট করা ভাল তাই এটি প্ল্যাটফর্মগুলির সাথে সামঞ্জস্যপূর্ণ - অন্যথায় কোড যা x86 / 24-7 এ চালিত হবে) আইএএ x৪ এর জন্য x64 মোটেও চলতে পারে না যদিও ইন্টেল আইএ 64৪ এর জন্য একইভাবে শক্তিশালী মেমরি মডেলটি প্রয়োগ করেছে) - মাইক্রোসফ্ট এগুলি স্বীকার করেছে - http://blogs.msdn.com/b/cbrumme/archive/2003/05/17/51445.aspx


3
মজাদার. আপনি এই রেফারেন্স করতে পারেন? আমি আনন্দের সাথে এটিকে ভোট দিয়েছি, তবে আমি যে রিসোর্সগুলি পড়েছি তার সাথে সামঞ্জস্যপূর্ণ একটি উচ্চ ভোটের উত্তরের 3 বছর পরে কিছু আক্রমণাত্মক ভাষার সাথে পোস্ট করার জন্য কিছুটা স্পষ্ট প্রমাণের প্রয়োজন হবে।
স্টিভেন ইভার্স

আপনি যদি কোন অংশটি উল্লেখ করতে চান তবে আপনি কোথাও থেকে কিছু জিনিস খনন করতে পেরে খুশি হবেন (আমি খুব সন্দেহ করি যে আমি কোনও x86 / x64 বিক্রেতার ব্যবসায়ের গোপন রহস্যই দূরে দিয়েছি, তাই এগুলি উইকি থেকে সহজেই পাওয়া উচিত, ইন্টেল পিআরএম (প্রোগ্রামারের রেফারেন্স ম্যানুয়ালগুলি), এমএসএফটি ব্লগগুলি, এমএসডিএন বা এরকম কিছু) ...
জ্যাচ

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

4
হ্যাঁ, আপনি যা বলছেন তা হ'ল 100% চিহ্নে অন্তত 99% নয়। আপনি যখন কাজের বিকাশে ছুটে আসেন তখন এই সাইটটি বেশিরভাগ ক্ষেত্রে কার্যকর (তবে বেশিরভাগ ক্ষেত্রেই) কার্যকর হয় তবে দুর্ভাগ্যক্রমে (গেমের) ভোটের সাথে সম্পর্কিত উত্তরগুলির যথার্থতা নেই। সুতরাং মূলত স্ট্যাকওভারফ্লোতে আপনি একটি অনুভূতি পেতে পারেন যে পাঠকদের জনপ্রিয় বোঝার বিষয়টি আসলে কী তা নয়। কখনও কখনও শীর্ষস্থানীয় উত্তরগুলি কেবল খাঁটি জিব্বাসী - ধরণের মিথের কাহিনী। এবং দুর্ভাগ্যক্রমে সমস্যাগুলি সমাধান করার সময় এই সমস্ত লোকেদের মধ্যে প্রজনন ঘটে read যদিও এটি বোধগম্য, কেউ সবকিছু জানতে পারে না।
ব্যবহারকারী 1416420

1
@ বেনভয়েগ আমি সমস্ত আর্কিটেকচারের বিষয়ে উত্তর দিতে পারলাম। নেট চলবে, তবে এটি কয়েকটি পৃষ্ঠা নেবে এবং এটি অবশ্যই উপযুক্ত নয়। স্বেচ্ছাসেবীর তুলনায় সর্বাধিক ব্যবহৃত .NET অন্তর্নিহিত হার্ডওয়্যার মেম-মডেলের উপর ভিত্তি করে লোকদের শিক্ষিত করা আরও ভাল। এবং আমার মন্তব্যে 'সর্বত্র', আমি লোকেদের / ক্যাশেটিকে অকার্যকর বলে ধরে নেওয়া ভুলগুলি সংশোধন করছিলাম They তারা কোন হার্ডওয়্যারটি নির্দিষ্ট না করেই অন্তর্নিহিত হার্ডওয়্যার সম্পর্কে অনুমান করেছিল।
জ্যাচ

16

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

আমি বলব যে আপনার সবসময় এটি কোনও লক এবং ইনক্রিমেন্টের চেয়ে পছন্দ করা উচিত।

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

আপনি যদি লক-ফ্রি কোড এবং এটি লেখার জন্য সঠিক উপায় সম্পর্কে আরও পড়তে চান তবে এটি একটি সত্যই নিবন্ধ

http://www.ddj.com/hpc-high-performance-computing/210604448


11

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

ইন্টারলকড। * এটি করার সঠিক উপায় ... আধুনিক সিপিইউগুলি আদিম হিসাবে এটি সমর্থন করার কারণে অনেক কম ওভারহেড।

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


8

তত্ত্বটি আসলে কীভাবে কাজ করে তা দেখতে আমি কিছু পরীক্ষা করেছি: kennethxu.blogspot.com/2009/05/interlocked-vs-monitor-performance.html । আমার পরীক্ষাটি তুলনামূলকভাবে বেশি মনোযোগ দিয়েছিল তবে বৃদ্ধির ফলাফল একই রকম। মাল্টি-সিপু পরিবেশে ইন্টারলকড দ্রুত প্রয়োজন হয় না। 2 বছরের পুরানো 16 সিপিইউ সার্ভারে বর্ধনের পরীক্ষার ফলাফল এখানে। মনে রাখবেন যে পরীক্ষাটি বর্ধনের পরে নিরাপদে পড়াও জড়িত, যা বাস্তব বিশ্বে সাধারণ।

D:\>InterlockVsMonitor.exe 16
Using 16 threads:
          InterlockAtomic.RunIncrement         (ns):   8355 Average,   8302 Minimal,   8409 Maxmial
    MonitorVolatileAtomic.RunIncrement         (ns):   7077 Average,   6843 Minimal,   7243 Maxmial

D:\>InterlockVsMonitor.exe 4
Using 4 threads:
          InterlockAtomic.RunIncrement         (ns):   4319 Average,   4319 Minimal,   4321 Maxmial
    MonitorVolatileAtomic.RunIncrement         (ns):    933 Average,    802 Minimal,   1018 Maxmial

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

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

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

2
আবার ফিরে তাকানো। সত্যিকারের বাধা যদি এফএসবি এর সাথে থাকে তবে মনিটরের বাস্তবায়নটি একই বাধাটি পর্যবেক্ষণ করা উচিত। আসল পার্থক্য হ'ল ইন্টারলকড ব্যস্ত অপেক্ষা এবং পুনরায় চেষ্টা করছেন যা উচ্চ কার্যকারিতা গণনার সাথে একটি আসল সমস্যা হয়ে দাঁড়িয়েছে। কমপক্ষে আমি আশা করি আমার মন্তব্যটি মনোযোগ বাড়িয়ে তুলবে যে ইন্টারলকড সর্বদা গণনা করার জন্য সঠিক পছন্দ নয়। জনগণ বিকল্পগুলির দিকে তাকাচ্ছে তা এটিকে ভালভাবে ব্যাখ্যা করেছে। আপনার একটি দীর্ঘ সংযোজন দরকার gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/…
কেনেথ Xu

8

3

আমি পার্থক্য অন্যান্য উত্তর উল্লেখিত যোগ করতে চাই volatile, Interlockedএবং lock:

এই ধরণের ক্ষেত্রগুলিতে অস্থির কিওয়ার্ড প্রয়োগ করা যেতে পারে :

  • রেফারেন্স প্রকার।
  • পয়েন্টারের ধরণ (একটি অনিরাপদ প্রসঙ্গে)। মনে রাখবেন যে পয়েন্টারটি নিজেই অস্থির হতে পারে তবে যে বস্তুটি এটি নির্দেশ করতে পারে না। অন্য কথায়, আপনি কোনও "পয়েন্টার "টিকে" উদ্বায়ী "হিসাবে ঘোষণা করতে পারবেন না।
  • যেমন সরল ধরনের sbyte, byte, short, ushort, int, uint, char, float, এবং bool
  • নিম্নলিখিত বেস ধরনের এক সঙ্গে একটি enum টাইপ: byte, sbyte, short, ushort, intঅথবা uint
  • জেনেরিক ধরণের পরামিতিগুলি রেফারেন্স ধরণের হিসাবে পরিচিত।
  • IntPtrএবং UIntPtr

অন্যান্য ধরণের সহ, doubleএবং long, "উদ্বায়ী" কারণ পড়ে এবং ঐ ধরনের ক্ষেত্র উদ্দেশে চিঠি লেখেন পারমাণবিক হতে নিশ্চিত করা যাবে না নয় বলে চিহ্নিত করা যেতে পারে। এই ধরণের ক্ষেত্রে একাধিক-থ্রেড অ্যাক্সেস রক্ষা করতে, Interlockedশ্রেণীর সদস্যদের ব্যবহার করুন বা lockবিবৃতিটি ব্যবহার করে অ্যাক্সেস রক্ষা করুন ।

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