মাল্টিথ্রেডেড সি বা সি ++ প্রোগ্রামিংয়ে কেন অস্থিরতা কার্যকর হিসাবে বিবেচিত হয় না?


165

আমি সম্প্রতি পোস্ট করা এই উত্তরে প্রদর্শিত হিসাবে , আমি volatileবহু-থ্রেড প্রোগ্রামিং প্রসঙ্গে ইউটিলিটি (বা এর অভাব) সম্পর্কে বিভ্রান্ত বলে মনে হচ্ছে ।

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

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

আমি কোথায় এবং কোথায় ভুল করছি?


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

4
এবং এখনও আবার, একটি প্রশ্ন যা এটি প্রাপ্য নয় এবং এটি উত্সাহিত হওয়ার আগে এখানে অনেকবার জিজ্ঞাসা করা হয়েছিল। আপনি কি দয়া করে এটি করা বন্ধ করবেন?

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

1
: সিপিইউ ডেটার সাথে কি (তাদের ক্যাশে মাধ্যমে) উপর একটি মহান গভীর অধ্যয়নের জন্য খুঁজে বার করো rdrop.com/users/paulmck/scalability/paper/whymb.2010.06.07c.pdf
Sassafras_wot

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

উত্তর:


213

volatileবহুবিবাহিত প্রসঙ্গে সমস্যাটি হ'ল এটি আমাদের প্রয়োজনীয় সমস্ত গ্যারান্টি সরবরাহ করে না । এটির আমাদের কয়েকটি সংখ্যক বৈশিষ্ট্য রয়েছে তবে এটি সমস্ত নয়, তাই আমরা volatile একা নির্ভর করতে পারি না ।

তবে, আমাদের বাকী সম্পত্তিগুলির জন্য যে আদিমগুলি ব্যবহার করতে হবে সেগুলিও তাদের সরবরাহ volatileকরে, তাই এটি কার্যকরভাবে অপ্রয়োজনীয়।

ভাগ করা ডেটাতে থ্রেড-নিরাপদ অ্যাক্সেসের জন্য আমাদের একটি গ্যারান্টি দরকার যা:

  • রিড / রাইটিং আসলে ঘটে (যে সংকলকটি কেবল তার পরিবর্তে একটি রেজিস্টারে মান সংরক্ষণ করবে না এবং মূল স্মৃতি মেমোরিকে আপডেট না করা পর্যন্ত পিছিয়ে দেবে)
  • যে কোনও পুনর্নির্মাণ হয় না। ধরে নিন যে আমরা volatileকোনও ডেটা পড়ার জন্য প্রস্তুত কিনা তা চিহ্নিত করতে পতাকা হিসাবে একটি পরিবর্তনশীল ব্যবহার করি । আমাদের কোড, আমরা কেবল পতাকা ডেটা প্রস্তুতি পর, সেট তাই সব সৌন্দর্য জরিমানা। তবে নির্দেশনাটি যদি পুনরায় সাজানো হয় তবে পতাকাটি প্রথমে সেট করা আছে ?

volatileপ্রথম পয়েন্ট গ্যারান্টি দেয়। এটিও গ্যারান্টি দেয় যে বিভিন্ন অস্থির পড়া / লেখার মধ্যে কোনও পুনরায় ক্রম ঘটে না । সমস্ত volatileমেমরি অ্যাক্সেস সেগুলিতে নির্দিষ্ট করা হয়েছে যাতে ঘটবে। যা প্রয়োজন তার জন্য আমাদের কেবল এটিই প্রয়োজন volatile: আই / ও রেজিস্টারগুলি বা মেমরি-ম্যাপযুক্ত হার্ডওয়্যার ম্যানিপুলেট করা, তবে এটি আমাদের মাল্টিথ্রেডেড কোডে সহায়তা করে না যেখানে volatileঅবজেক্টটি কেবলমাত্র অ-অস্থির ডেটার অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়। সেই অ্যাক্সেসগুলি এখনও এর তুলনায় পুনরায় সাজানো যেতে volatileপারে।

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

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

যেহেতু সি ++ ১১, পরমাণু ভেরিয়েবল ( std::atomic<T>) আমাদের সমস্ত প্রাসঙ্গিক গ্যারান্টি দেয়।


5
@jbcreix: আপনি কোন "এটি" সম্পর্কে জিজ্ঞাসা করছেন? অস্থির বা স্মৃতি বাধা? যাই হোক না কেন, উত্তরটি বেশ একই রকম। তাদের উভয়ই সংকলক এবং সিপিইউ স্তরে উভয়কেই কাজ করতে হবে, যেহেতু তারা প্রোগ্রামটির পর্যবেক্ষণযোগ্য আচরণ বর্ণনা করে --- তাই তাদের নিশ্চিত করতে হবে যে সিপিইউ সমস্ত কিছু পুনরায় অর্ডার না করে, তার গ্যারান্টিটি পরিবর্তন করে। তবে আপনি বর্তমানে পোর্টেবল থ্রেড সিঙ্ক্রোনাইজেশন লিখতে পারবেন না, কারণ মেমরির বাধাগুলি স্ট্যান্ডার্ড সি ++ এর অংশ নয় (সুতরাং তারা বহনযোগ্য নয়), এবং কার্যকর volatileহওয়ার পক্ষে যথেষ্ট শক্তিশালী নয়।
jalf

4
: একটি দুটিই MSDN উদাহরণ এই আছে, এবং যে দাবি নির্দেশাবলী একটি উদ্বায়ী এক্সেস গত পুনর্বিন্যস্তভাবে করা যাবে না msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx
OJW

27
@ ওজেডাব্লু: তবে মাইক্রোসফ্ট সংকলক volatileএকটি সম্পূর্ণ মেমরি বাধা (পুনঃক্রম রোধ করা) হতে পুনরায় সংজ্ঞা দেয়। এটি স্ট্যান্ডার্ডের অংশ নয়, সুতরাং আপনি পোর্টেবল কোডে এই আচরণের উপর নির্ভর করতে পারবেন না।
জলফ

4
@ স্কিজ: না, সমীকরণের "সংকলক যাদু" অংশটি এখানে আসে। সিপিইউ এবং সংকলক উভয়ই একটি স্মৃতি বাধা বুঝতে হবে to সংকলক যদি মেমোরি বাধাটির শব্দার্থ বোঝে, তবে এটি সেই ধরণের কৌশলগুলি এড়াতে জানে (পাশাপাশি বাধা পেরিয়ে পুনরায় ক্রমান্বয়ে পাঠ করে / লেখায়)। আর সৌভাগ্য যে, কম্পাইলার আছে একটি মেমরি বাধা শব্দার্থবিদ্যা বুঝতে, তাই শেষ পর্যন্ত, এটি সমস্ত কাজ। :)
জুলফ

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

49

আপনি এটি লিনাক্স কার্নেল ডকুমেন্টেশন থেকেও বিবেচনা করতে পারেন ।

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

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

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

কার্নেল কোডের একটি সাধারণ ব্লক বিবেচনা করুন:

spin_lock(&the_lock);
do_something_on(&shared_data);
do_something_else_with(&shared_data);
spin_unlock(&the_lock);

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

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

উদ্বায়ী স্টোরেজ ক্লাসটি মূলত মেমরি-ম্যাপযুক্ত আই / ও রেজিস্টারের জন্য বোঝানো হত। কার্নেলের মধ্যে, রেজিস্টার অ্যাক্সেসগুলিও, লক দ্বারা সুরক্ষিত করা উচিত, তবে একটিও সঙ্কলকটিকে "অপ্টিমাইজ করা" একটি সমালোচনামূলক বিভাগের মধ্যে রেজিস্টার অ্যাক্সেসগুলি চায় না। তবে, কার্নেলের মধ্যে, আই / ও মেমরি অ্যাক্সেসগুলি সর্বদা অ্যাকসেসর ফাংশনের মাধ্যমে করা হয়; পয়েন্টারগুলির মাধ্যমে সরাসরি I / O মেমোরি অ্যাক্সেস করা ভ্রান্ত হয় এবং সমস্ত আর্কিটেকচারে কাজ করে না। এই অ্যাক্সেসরগুলি অযাচিত অপ্টিমাইজেশন প্রতিরোধ করার জন্য লিখিত হয়েছে, সুতরাং, আবারও, উদ্বায়ী অপ্রয়োজনীয়।

প্রসেসর যখন কোনও ভেরিয়েবলের মান নিয়ে ব্যস্ত-অপেক্ষা করে থাকে তখন অন্য পরিস্থিতিটি যখন অস্থির ব্যবহারের জন্য প্রলুব্ধ হতে পারে। ব্যস্ত অপেক্ষা করার সঠিক উপায় হ'ল:

while (my_variable != what_i_want)
    cpu_relax();

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

এখনও কয়েকটি বিরল পরিস্থিতি রয়েছে যেখানে কর্নেলের মধ্যে অস্থিরতা বোধ করা হয়:

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

  • ইনলাইন অ্যাসেম্বলি কোড যা মেমরি পরিবর্তন করে, তবে এর কোনও দৃশ্যমান পার্শ্ব প্রতিক্রিয়া নেই, জিসিসি দ্বারা ঝুঁকি মোছা হচ্ছে। অ্যাসেট স্টেটমেন্টে অস্থির কীওয়ার্ড যুক্ত করা এই অপসারণটিকে রোধ করবে।

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

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

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


3
@ কুরিয়াসগুয়ে: হ্যাঁ Gcc.gnu.org/onlinesocs/gcc-4.0.4/gcc/Extended-Asm.html এও দেখুন ।
সেবাস্তিয়ান মাচ

1
স্পিন_লক () দেখতে একটি নিয়মিত ফাংশন কল বলে মনে হচ্ছে। এটি কী বিশেষ যে সংকলকটি এটির সাথে বিশেষভাবে আচরণ করবে যাতে উত্পন্ন কোডটি স্পিন_লক () এর আগে পড়া এবং রেজিস্টারে সংরক্ষণ করা শেয়ারড_ডাতার কোনও মান "ভুলে যায়" যাতে মানটি নতুন করে পড়তে হয় স্পিন_লক () এর পরে do_something_on ()?
সিঙ্কোপেটেড

1
@ আসরস্কোর_ডি আমার বক্তব্যটি হ'ল স্পিন_লোক () নামটি ফাংশন থেকে বলতে পারি না যে এটি বিশেষ কিছু করে। আমি জানি না এতে কী আছে। বিশেষত, আমি জানি না যে বাস্তবায়নের মধ্যে এমন কী রয়েছে যা সংকলককে পরবর্তী পাঠগুলি অপ্টিমাইজ করতে বাধা দেয়।
Syncopated

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

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

11

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

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

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

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


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

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

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

10
@ জেরেমি, আপনি অনুশীলনে সঠিক আছেন তবে তাত্ত্বিকভাবে এটি এখনও ভেঙে যেতে পারে। একটি দুটি মূল সিস্টেমে একটি কোর ক্রমাগত আপনার কর্মী থ্রেড চালাচ্ছে। অন্যান্য কোরটি সত্যকে বুলে দেয়। তবে শ্রমিকের থ্রেডের মূলটি যে পরিবর্তনটি দেখতে পাবে তার কোনও নিশ্চয়তা নেই, অর্থাত্ বার বার এটি পরীক্ষা করা সত্ত্বেও এটি কখনও থামতে পারে না। এই আচরণটি সি ++ 0 এক্স, জাভা এবং সি # মেমরি মডেল দ্বারা অনুমোদিত। অনুশীলনে এটি কখনই ব্যস্ত থ্রেড হিসাবে দেখা যায় না কারণ সম্ভবত কোথাও কোনও স্মৃতি বাধা sertোকানো হয়, এর পরে এটি বুলের পরিবর্তনটি দেখতে পাবে।
deft_code

4
একটি পসিক্স সিস্টেম নিন, রিয়েল টাইম শিডিয়ুলিং নীতি ব্যবহার করুন, সিস্টেমের SCHED_FIFOঅন্যান্য প্রক্রিয়া / থ্রেডের তুলনায় উচ্চতর স্থিতিশীল অগ্রাধিকার, যথেষ্ট কোরগুলি পুরোপুরি সম্ভব হওয়া উচিত। লিনাক্সে আপনি নির্দিষ্ট করতে পারেন যে আসল-সময় প্রক্রিয়া সিপিইউ সময়ের 100% ব্যবহার করতে পারে। যদি উচ্চতর অগ্রাধিকারের থ্রেড / প্রক্রিয়া না থাকে এবং আই / ও দ্বারা কখনই অবরুদ্ধ হয় না তবে তারা প্রসঙ্গের স্যুইচ করবে না। তবে মুল বক্তব্যটি volatileহ'ল সি / সি ++ সঠিক ডাটা শেয়ারিং / সিঙ্ক্রোনাইজেশন শব্দার্থবিজ্ঞান প্রয়োগের জন্য নয়। আমি বিশেষ কোডগুলি অনুসন্ধান করতে দেখি যে ভুল কোডটি হয়ত কখনও কখনও কাজ করতে পারে তা অকেজো অনুশীলন।
FooF

7

volatileএকটি স্পিনলক মিউটেক্সের বুনিয়াদী কাঠামো বাস্তবায়নের জন্য দরকারী (অপর্যাপ্ত হলেও), তবে একবার আপনি এটি (বা আরও ভাল কিছু) পেয়ে গেলে আপনার আর কোনও প্রয়োজন হবে না volatile

মাল্টিথ্রেডেড প্রোগ্রামিংয়ের সাধারণ উপায়টি মেশিন পর্যায়ে প্রতিটি ভাগ করা পরিবর্তনশীলকে রক্ষা করা নয়, বরং গার্ড ভেরিয়েবলগুলি প্রবর্তন করা যা প্রোগ্রামের প্রবাহকে গাইড করে। পরিবর্তে volatile bool my_shared_flag;আপনার উচিত

pthread_mutex_t flag_guard_mutex; // contains something volatile
bool my_shared_flag;

এটি কেবল "শক্ত অংশ" কে আবদ্ধ করে না এটি মৌলিকভাবে প্রয়োজনীয়: সি একটি মিটেক্স প্রয়োগের জন্য প্রয়োজনীয় পারমাণবিক ক্রিয়াকলাপকে অন্তর্ভুক্ত করে না ; এটি কেবল সাধারণ অপারেশন volatileসম্পর্কে অতিরিক্ত গ্যারান্টি দিতে হবে ।

এখন আপনার কাছে এরকম কিছু রয়েছে:

pthread_mutex_lock( &flag_guard_mutex );
my_local_state = my_shared_flag; // critical section
pthread_mutex_unlock( &flag_guard_mutex );

pthread_mutex_lock( &flag_guard_mutex ); // may alter my_shared_flag
my_shared_flag = ! my_shared_flag; // critical section
pthread_mutex_unlock( &flag_guard_mutex );

my_shared_flag অপ্রয়োজনীয় হওয়া সত্ত্বেও অস্থির হওয়ার দরকার নেই, কারণ

  1. অন্য থ্রেডে এটির অ্যাক্সেস রয়েছে।
  2. এর অর্থ এটির কোনও রেফারেন্স অবশ্যই কিছু সময় নেওয়া হয়েছিল ( &অপারেটরের সাথে)।
    • (বা একটি সম্বলিত কাঠামোতে একটি রেফারেন্স নেওয়া হয়েছিল)
  3. pthread_mutex_lock একটি গ্রন্থাগার ফাংশন।
  4. অর্থ pthread_mutex_lockসংকলকটি কোনওভাবে সেই উল্লেখটি অর্জন করে কিনা তা বলতে পারে না ।
  5. কম্পাইলার অর্থ আবশ্যক অনুমান যে pthread_mutex_lockmodifes ভাগ পতাকা !
  6. সুতরাং ভেরিয়েবলটি অবশ্যই মেমরি থেকে পুনরায় লোড করতে হবে। volatileযদিও এই প্রসঙ্গে অর্থবহ, বহিরাগত।

6

আপনার বোঝা সত্যিই ভুল।

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

int volatile* reg=IO_MAPPED_REGISTER_ADDRESS;
*reg=1; // turn the fuel on
*reg=2; // ignition
*reg=3; // release
int x=*reg; // fire missiles

সমস্যাটি হ'ল, এটি থ্রেড-নিরাপদ যে কোনও জিনিস থেকে আমরা চাই এমন সম্পত্তি নয়।

উদাহরণস্বরূপ, একটি থ্রেড-নিরাপদ কাউন্টারটি কেবল (লিনাক্স-কার্নেল-জাতীয় কোড, সি ++ 0x সমতুল্য জানেন না) হবে:

atomic_t counter;

...
atomic_inc(&counter);

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

atomic_inc(&counter);
atomic_inc(&counter);

এখনও অনুকূলিত হতে পারে

atomically {
  counter+=2;
}

অপ্টিমাইজারটি যদি যথেষ্ট স্মার্ট হয় (এটি কোডের শব্দার্থকে পরিবর্তন করে না)।


6

আপনার ডেটা সমবর্তী পরিবেশে সামঞ্জস্য রাখতে আপনার প্রয়োগ করতে দুটি শর্ত প্রয়োজন:

১) পারমাণবিকতা অর্থাত্ যদি আমি মেমোরিতে কিছু তথ্য পড়ি বা লিখি তবে সেই তথ্যটি একটি পাসে পড়ে / লিখিত হয় এবং প্রসঙ্গের সুইচের কারণে বাধাগ্রস্থ বা বিতর্ক করা যায় না

2) সমন্নয় পঠন / লিখন অপস ক্রম অর্থাৎ করা আবশ্যক দেখা একাধিক সমবর্তী পরিবেশের মধ্যে একই হতে - হতে যে থ্রেড, মেশিন ইত্যাদি

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

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

একটি পরিবর্তনশীলটিকে অস্থির হিসাবে চিহ্নিত করার অর্থ হ'ল আপনি প্রতিবার মেমরি থেকে আসা এবং মেমরি থেকে মূল্য প্রতি চাপিয়ে দিতে বাধ্য করছেন যা বেশিরভাগ ক্ষেত্রে আপনার কোডটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায় c

সি # এবং জাভা এএফআইএকে অস্থির আনুগত্য করে 1) এবং 2 এর সমাধান করে) তবে সি / সি ++ সংকলকগুলির ক্ষেত্রে এটি একইভাবে বলা যায় না তাই মূলত আপনি উপযুক্ত হিসাবে দেখতে এটির সাথে এটি করুন।

কিছু গভীরতা আরও (যদিও নিরপেক্ষ নয়) বিষয়ে আলোচনার জন্য পড়া এই


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

স্বতন্ত্র পড়তে ও লিখতে কখন মেমরিকে বাধা দেয় এবং অ-পরমাণু হয়? কোন লাভ আছে কি?
ব্যাটব্র্যাট

5

কম্প.প্রগ্রামিং.থ্রেডস এফএকিউ এর ডেভ বুটেনফের একটি ক্লাসিক ব্যাখ্যা রয়েছে:

Q56: আমার কেন ভাগ করা ভেরিয়েবল ভোল্যাটাইল ঘোষণা করার দরকার নেই?

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

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

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

সুতরাং যদি আপনার প্রোগ্রামটি যদি অস্থিরতা ব্যবহার না করে বলে বিরতি দেয় তবে এটি একটি বিজিজি। এটি সি-তে একটি বাগ বা থ্রেড লাইব্রেরিতে বাগ বা কার্নেলের মধ্যে কোনও বাগ নাও থাকতে পারে। তবে এটি একটি সিস্টেমে বাগ এবং এটির সমাধানের জন্য those উপাদানগুলির মধ্যে এক বা একাধিককে কাজ করতে হবে।

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

/ --- [ডেভ বুটেনহফ] ----------------------- [বুটেনহফ@zko.dec.com] --- \
| ডিজিটাল সরঞ্জাম কর্পোরেশন 110 স্পিট ব্রুক আরডি জেড কেও 2-3 / কি 18 |
| 603.881.2218, ফ্যাক্স 603.881.0120 নশুয়া এনএইচ 03062-2698 |
----------------- [কনকুরেন্সির মাধ্যমে আরও ভাল জীবনযাপন] ---------------- /

মিঃ বুটেনহফ এই ইউজনেট পোস্টটিতে একই স্থলটির বেশিরভাগ অংশ জুড়েছেন :

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

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

সি ++ তে সমানভাবে প্রযোজ্য।


লিঙ্কটি ভেঙে গেছে; আপনি যেটা উদ্ধৃত করতে চেয়েছিলেন সেটি এখন আর নির্দেশ করবে বলে মনে হয় না। পাঠ্য ছাড়া এটির এক ধরণের অর্থহীন উত্তর।
www.www

3

এটি "অস্থির" যা করছে তা হ'ল: "আরে সংকলক, কোনও স্থানীয় নির্দেশনা এতে কাজ না করলেও এই চলকটি যে কোনও মুহুর্তে (যে কোনও ক্লক টিকের উপরে) পরিবর্তন করতে পারে a এই রেজিস্টারটিতে এই মানটি ক্যাশে করবেন না" "

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

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


3

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

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

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


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

বেশিরভাগ প্ল্যাটফর্মে, volatileহার্ডওয়্যার নির্ভর কিন্তু সংকলক-স্বতন্ত্র, এমন কোনও পদ্ধতিতে একজনকে ওএস লেখার জন্য কী করতে হবে তা স্বীকার করা মোটামুটি সহজ । প্রোগ্রামাররা volatileপ্রয়োজন অনুযায়ী কাজ করার পরিবর্তে বাস্তবায়ন-নির্ভর বৈশিষ্ট্যগুলি ব্যবহার করে এমন একটি স্ট্যান্ডার্ড থাকার উদ্দেশ্যকে ক্ষুন্ন করে।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.