সি ++ 11 এ সাধারণত volatileথ্রেডিংয়ের জন্য কখনও ব্যবহার করবেন না , কেবল এমএমআইওর জন্য
তবে টিএল: ডিআর, এটি mo_relaxedসুসংগত ক্যাশে (অর্থাত্ সবকিছু) সহ হার্ডওয়ারের সাথে পরমাণুর মতো ধরণের "কাজ" করে; এটি রেজিস্টারগুলিতে ভার সংযোজনকারীদের থামাতে যথেষ্ট। atomicপারমাণবিকতা বা আন্ত-থ্রেড দৃশ্যমানতা তৈরি করতে মেমরির বাধাগুলির প্রয়োজন হয় না, কেবল এই থ্রেডের অ্যাক্সেসের মধ্যে বিভিন্ন ভেরিয়েবলের মধ্যে ক্রম তৈরি করার জন্য কোনও ক্রিয়াকলাপের আগে / পরে বর্তমান থ্রেডটিকে অপেক্ষা করতে হবে। mo_relaxedকখনই কোনও বাধা দরকার নেই, কেবল লোড, স্টোর বা আরএমডাব্লু।
সি ++ 11 এর আগের খারাপ পুরানো দিনগুলিতেvolatile (এবং বাধাগুলির জন্য ইনলাইন- এসএম) রোল-আপনার নিজস্ব অ্যাটমিক্সের জন্য , কিছু কাজ করার একমাত্র ভাল উপায় ছিল । তবে বাস্তবায়নগুলি কীভাবে কার্যকর হয়েছিল এবং কোনও মানদণ্ড দ্বারা কখনই গ্যারান্টিযুক্ত ছিল না সে সম্পর্কে অনেক অনুমানের উপর নির্ভর করে।std::atomicvolatile
উদাহরণস্বরূপ, লিনাক্স কার্নেল এখনও নিজস্ব হ্যান্ড রোলড অ্যাটমিক্সের সাহায্যে ব্যবহার করে volatileতবে কয়েকটি নির্দিষ্ট সি বাস্তবায়ন (জিএনইউ সি, ঝনঝন এবং আইসিসি) সমর্থন করে। আংশিকভাবে এটি জিএনইউ সি এক্সটেনশনের কারণে এবং ইনলাইন asm সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের কারণে, তবে এটি কম্পাইলাররা কীভাবে কাজ করে সে সম্পর্কে কিছু অনুমানের উপর নির্ভর করে।
এটি প্রায়শই নতুন প্রকল্পগুলির জন্য ভুল পছন্দ; আপনার std::atomicসাথে std::memory_order_relaxedএকই দক্ষ মেশিন কোড নির্গত করতে একটি সংকলক পেতে আপনি (সহ ) ব্যবহার করতে পারেন volatile। থ্রেডিং উদ্দেশ্যে অপ্রচলিত std::atomicসঙ্গে । mo_relaxedvolatile(বাদে কিছু সংকলক সহ মিস-অপ্টিমাইজেশন বাগগুলি নিয়ে কাজ করাatomic<double> বাদে ))
std::atomicমূলধারার সংকলকগুলিতে অভ্যন্তরীণ বাস্তবায়ন (যেমন সিসিসি এবং ঝনঝন) কেবল অভ্যন্তরীণভাবে ব্যবহার করে নাvolatile ; সংকলকগণ সরাসরি পারমাণবিক লোড, স্টোর এবং আরএমডব্লিউ অন্তর্নির্মিত কার্যাদি প্রকাশ করে। (যেমন GNU C __atomicবিল্টিনগুলি যা "প্লেইন" অবজেক্টগুলিতে কাজ করে))
চঞ্চল অনুশীলনে ব্যবহারযোগ্য (তবে এটি করবেন না)
এটি বলেছে যে, সিপিইউ কীভাবে কাজ করে (সুসংগত ক্যাশে) এবং কীভাবে কাজ করা উচিত সে সম্পর্কে ভাগাভাগি করা অনুমানের কারণে, আসল সিপিইউগুলিতে সমস্ত (?) বিদ্যমান সি ++ বাস্তবায়নের উপর পতাকা লাগার volatileমতো জিনিসের জন্য অনুশীলনযোগ্য ব্যবহারযোগ্য exit_now? volatileতবে অন্য কিছু নয় এবং প্রস্তাবিত নয় । এই উত্তরের উদ্দেশ্যটি বিদ্যমান সিপিইউ এবং সি ++ বাস্তবায়ন কীভাবে কাজ করে তা ব্যাখ্যা করা। আপনি যদি std::atomicসেটির বিষয়ে চিন্তা করেন না তবে আপনাকে কেবল volatileথ্রেডিংয়ের জন্য মো_ রিল্যাক্সড অপ্রচলিতগুলির সাথে জানা দরকার ।
(আইএসও সি ++ স্ট্যান্ডার্ড এটি সম্পর্কে অস্পষ্ট, কেবল এই বলে যে volatileঅ্যাক্সেসগুলি সি ++ অ্যাবস্ট্রাক্ট মেশিনের নিয়ম অনুসারে কঠোরভাবে মূল্যায়ন করা উচিত, অপ্টিমাইজড নয়। এই বাস্তব বাস্তবায়নগুলি মেশিনের মেমরির ঠিকানা + স্পেসকে সি ++ অ্যাড্রেস স্পেস মডেল হিসাবে ব্যবহার করে, এর অর্থ volatileমেমরিটিতে অবজেক্ট-প্রতিনিধিত্ব অ্যাক্সেসের জন্য পড়ার এবং অ্যাসাইনমেন্টগুলিকে লোড / স্টোর নির্দেশাবলী সংকলন করতে হবে))
অন্য একটি উত্তরের হিসাবে উল্লেখ করা হয়েছে, একটি exit_nowপতাকা আন্তঃ-থ্রেড যোগাযোগের একটি সহজ কেস যার কোনও সমন্বয় প্রয়োজন হয় না : এটি প্রকাশ করছে না যে অ্যারের সামগ্রীগুলি প্রস্তুত রয়েছে বা এর মতো কিছু or কেবলমাত্র একটি স্টোর যা তাত্ক্ষণিকভাবে অন্য থ্রেডে অপ্টিমাইটিসড-লোড লোড দ্বারা তাত্ক্ষণিকভাবে লক্ষ্য করা গেছে।
// global
bool exit_now = false;
// in one thread
while (!exit_now) { do_stuff; }
// in another thread, or signal handler in this thread
exit_now = true;
অস্থির বা পারমাণবিক ব্যতীত , কোনও ডাটা-রেস ইউবি-র বিধি হিসাবে নিয়ম এবং অনুমানকরণ একটি সংকলককে এএসমে রূপান্তর করতে দেয় যা কেবল অসীম লুপে প্রবেশের আগে (বা না) একবার পতাকাটি পরীক্ষা করে । বাস্তব সংকলকগুলির জন্য বাস্তব জীবনে ঠিক এটি ঘটে। (এবং সাধারণত বেশিরভাগ ক্ষেত্রেই অপ্টিমাইজ করা হয় do_stuffকারণ লুপটি কখনই প্রস্থান করে না, সুতরাং পরবর্তী কোনও কোড যা ফলাফলটি ব্যবহার করতে পারে সেগুলি যদি আমরা লুপটি প্রবেশ করি তবে তা পৌঁছনীয় নয়)।
// Optimizing compilers transform the loop into asm like this
if (!exit_now) { // check once before entering loop
while(1) do_stuff; // infinite loop
}
মাল্টিথ্রেডিং প্রোগ্রামটি অনুকূলিত মোডে আটকে গেছে তবে সাধারণত -O0 এ চলে যায় এর একটি উদাহরণ (জিসিসির এসএম আউটপুট বিবরণ সহ) কীভাবে এটি এক্সএম --6464- তে জিসিসির সাথে ঘটেছিল। এছাড়াও এমসিইউ প্রোগ্রামিং - সি ++ ও 2 অপটিমাইজেশন ব্রেক হয়ে যায় যখন ইলেক্ট্রনিক্সে লুপ হয় SEএসই অন্য একটি উদাহরণ দেখায়।
আমরা সাধারণত আক্রমনাত্মক অপ্টিমাইজেশন চাই যা সিএসই এবং উত্তোলন বৈশ্বিক ভেরিয়েবলগুলি সহ লুপের বাইরে চাপিয়ে দেয়।
সি ++ 11 এর আগে,volatile bool exit_now এই কাজটি উদ্দেশ্য হিসাবে তৈরি করার এক উপায় ছিল (সাধারণ সি ++ বাস্তবায়নে)। তবে সি ++ ১১-এ, ডেটা-রেস ইউবি এখনও প্রযোজ্য volatileতাই এটি এইচএসডাব্লু সংহত ক্যাশে এমনকি ধরে নিলেও বাস্তবে সর্বত্র কাজ করার জন্য আইএসও স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত নয় ।
নোট করুন যে বিস্তৃত প্রকারের জন্য, volatileটিয়ার অভাবের কোনও গ্যারান্টি দেয় না। আমি এখানে এই পার্থক্যটিকে এড়িয়ে গেছি boolকারণ এটি সাধারণ বাস্তবায়নের কোনও বিষয় নয়। তবে এটি volatileএখনও শিথিল পারমাণবিকের সমতুল্য হওয়ার পরিবর্তে ডেটা রেস ইউবি সাপেক্ষে কেন এটি তার একটি অংশ ।
নোট করুন যে "উদ্দেশ্য হিসাবে" থ্রেডের অর্থ exit_nowঅন্য থ্রেডটি প্রকৃতপক্ষে প্রস্থান হওয়ার জন্য অপেক্ষা করছে its বা এমনকি এটি যে exit_now=trueএই থ্রেডে পরবর্তী ক্রিয়াকলাপ চালিয়ে যাওয়ার আগে অস্থির স্টোরটি বিশ্বব্যাপী দৃশ্যমান হওয়ার জন্যও অপেক্ষা করে । ( atomic<bool>ডিফল্টরূপে mo_seq_cstএটি পরবর্তী কোনও seq_cst লোড হওয়ার আগে অপেক্ষা করতে সক্ষম করে তোলে many অনেক আইএসএতে আপনি কেবল স্টোরের পরে একটি সম্পূর্ণ বাধা পেতে পারেন)।
সি ++ 11 একটি নন-ইউবি উপায় সরবরাহ করে যা একই সংকলন করে
A অথবা "প্রস্থান এখন" ফ্ল্যাগ ব্যবহার করা উচিত "চলমান রাখতে" std::atomic<bool> flagসঙ্গেmo_relaxed
ব্যবহার
flag.store(true, std::memory_order_relaxed)
while( !flag.load(std::memory_order_relaxed) ) { ... }
আপনি ঠিক একই asm (কোনও ব্যয়বহুল বাধা নির্দেশাবলী সহ) দেবেন যা আপনি পেয়েছিলেন volatile flag।
নন-টিয়ারিংয়ের atomicপাশাপাশি আপনাকে একটি থ্রেডে সঞ্চয় এবং ইউবি ছাড়াই অন্যটিতে লোড করার ক্ষমতাও দেয়, তাই সংকলকটি লুপের বাইরে লোড উত্তোলন করতে পারে না। (কোনও ডেটা রেস ইউবি-র ধারণা হ'ল নন-পারমাণবিক অ-উদ্বায়ী বস্তুগুলির জন্য আমরা যে আগ্রাসী অপ্টিমাইজেশন চাই তা অনুমোদন দেয়)) এই বৈশিষ্ট্যটি খাঁটি লোড এবং খাঁটি স্টোরগুলিতে atomic<T>যা করতে volatileপারে তেমনই একই ।
atomic<T>এছাড়াও করা +=এবং তাই পারমাণবিক RMW অপারেশন মধ্যে (ক অস্থায়ী চালনা, তারপর একটি পৃথক পারমাণবিক দোকান মধ্যে একটি পারমাণবিক লোড তুলনায় উল্লেখযোগ্যভাবে আরো ব্যয়বহুল। আপনি একটি পারমাণবিক RMW না চান তাহলে, একটি স্থানীয় অস্থায়ী সঙ্গে আপনার কোড লিখতে) উপর।
আপনি যে ডিফল্ট seq_cstঅর্ডারটি পেয়েছিলেন while(!flag)তা দিয়ে , এটি ক্রমশ গ্যারান্টি সরবরাহ করে। অ-পারমাণবিক অ্যাক্সেসগুলি এবং অন্যান্য পারমাণবিক অ্যাক্সেসগুলিতে।
(ধারণায়, ISO C ++ স্ট্যান্ডার্ডের atomics এর দ্বারা কম্পাইল-টাইম অপ্টিমাইজেশান বাতিল না। কিন্তু বাস্তবে কম্পাইলার না নিয়ন্ত্রণ করার কোনো উপায় যখন যে ঠিক হবে না কারণ নেই। কিছু ক্ষেত্রে আছে যেখানে এমনকি volatile atomic<T>না করি পারমাণবিকগুলির অপ্টিমাইজেশনের উপর পর্যাপ্ত নিয়ন্ত্রণ থাকুন যদি সংকলকরা অপ্টিমাইজ করে, তবে এখনকারীর জন্য সংকলকরা তা করেন না See দেখুন কম্পাইলারগুলি রিলান্ড্যান্ট এসটিডি সংহত করে না কেন :: পরমাণু লেখেন? নোট করুন যে ডাব্লুজি 21 / পি 10062 volatile atomicঅপ্টিমাইজেশনের বিরুদ্ধে রক্ষা করার জন্য বর্তমান কোড ব্যবহার করার বিরুদ্ধে সুপারিশ করে? atomics।)
volatile প্রকৃত সিপিইউতে এটির জন্য আসলে কাজ করে (তবে এখনও এটি ব্যবহার করবেন না)
এমনকি দুর্বল-অর্ডারযুক্ত মেমরি মডেলগুলির সাথে (নন-x86) । কিন্তু আসলে এটি ব্যবহার করবেন না, ব্যবহার atomic<T>সঙ্গে mo_relaxedপরিবর্তে !! এই বিভাগের বিষয়টি হ'ল আসল সিপিইউগুলি কীভাবে ন্যায়সঙ্গত কাজ করে না তা সম্পর্কে ভুল ধারণাগুলি সমাধান করা volatile। আপনি যদি লকলেস কোড লিখছেন তবে আপনি সম্ভবত কর্মক্ষমতা সম্পর্কে যত্নশীল। ক্যাশে এবং আন্তঃ-থ্রেড যোগাযোগের ব্যয় বোঝা ভাল পারফরম্যান্সের জন্য সাধারণত গুরুত্বপূর্ণ।
রিয়েল সিপিইউগুলিতে সুসংগত ক্যাশে / ভাগ করা মেমরি থাকে: একটি কোর থেকে কোনও স্টোর বিশ্বব্যাপী দৃশ্যমান হওয়ার পরে, অন্য কোনও কোর কোনও বাসি মান লোড করতে পারে না । ( পুরাণ প্রোগ্রামাররাও দেখুন সিপিইউ ক্যাশে সম্পর্কে বিশ্বাস করুন যা জাভা atomic<T>ভোলিটাইলস সম্পর্কে কিছু কথা বলেছে, যা সেক_সিএসটি মেমরি ক্রমের সাথে সি ++ এর সমতুল্য ))
আমি যখন লোড বলি , তখন আমার অর্থ এমন একটি asm নির্দেশ যা স্মৃতিতে অ্যাক্সেস করে। এটিই volatileঅ্যাক্সেস নিশ্চিত করে এবং অ-পরমাণু / অ-উদ্বায়ী সি ++ ভেরিয়েবলের লভ্যালু-টু-রালভ রূপান্তর হিসাবে একই জিনিস নয় । (যেমন local_tmp = flagবা while(!flag))।
আপনাকে কেবলমাত্র পরাজিত করতে হবে কম্পাইল-টাইম অপ্টিমাইজেশন যা প্রথম চেকের পরে পুনরায় লোড হয় না। কোনও ক্রম ছাড়াই প্রতিটি পুনরাবৃত্তিতে যে কোনও লোড + চেক যথেষ্ট। এই থ্রেড এবং মূল থ্রেডের মধ্যে সুসংগততা ব্যতীত কখন স্টোরটি ঘটেছিল বা লোডের আর্টের অর্ডার দেওয়ার কথা বলা অর্থপূর্ণ নয়। লুপ অন্যান্য অপারেশন। কেবলমাত্র যখন এই থ্রেডটিতে দৃশ্যমান হয় তখন তা গুরুত্বপূর্ণ। আপনি প্রস্থান করুন_ পতাকা পতাকাটি দেখলে আপনি প্রস্থান করবেন। টিপিক্যাল x86 সিওনের আন্ত-কোর ল্যাটেন্সি পৃথক শারীরিক কোরের মধ্যে 40ns এর মতো কিছু হতে পারে ।
তত্ত্বে: সুসংগত ক্যাশেবিহীন হার্ডওয়্যারে সি ++ থ্রেড
সোর্স কোডে স্পষ্টত ফ্লাশ করার জন্য প্রোগ্রামারের প্রয়োজন ছাড়াই কেবল খাঁটি আইএসও সি ++ সহ এটি দূরবর্তীভাবে কার্যকর হতে পারে এমন কোনও উপায়ে আমি দেখছি না।
তত্ত্ব অনুসারে আপনি এমন কোনও মেশিনে সি ++ বাস্তবায়ন করতে পারেন যা এটির মতো ছিল না, সংকলক দ্বারা উত্পাদিত সুস্পষ্ট ফ্লাশগুলি অন্য কোরে অন্য থ্রেডগুলিতে দৃশ্যমান করার জন্য প্রয়োজন । (বা পড়ার জন্য সম্ভবত বাসি অনুলিপি ব্যবহার না করার জন্য)। সি ++ স্ট্যান্ডার্ড এটিকে অসম্ভব করে তোলে না, তবে সি ++ এর মেমরির মডেল সুসংগত শেয়ারড মেমরি মেশিনে দক্ষ হওয়ার আশেপাশে তৈরি করা হয়েছে। যেমন সি ++ স্ট্যান্ডার্ড এমনকি "পঠন-পঠন সমন্বয়", "রাইট-রিড সুসংহততা" ইত্যাদি সম্পর্কে কথা বলে etc. স্ট্যান্ডার্ডের একটি নোট এমনকি হার্ডওয়্যারটির সংযোগকেও নির্দেশ করে:
http://eel.is/c++draft/intro.races#19
[দ্রষ্টব্য: চারটি পূর্ববর্তী সুসংগত প্রয়োজনীয়তা কার্যকরভাবে একক বস্তুতে পারমাণবিক ক্রিয়াকলাপের সংকলক পুনর্বিন্যাসের অনুমতি দেয় না, এমনকি উভয় ক্রিয়াকলাপ শিথিল বোঝা হলেও। এটি কার্যকরভাবে সি ++ পারমাণবিক ক্রিয়াকলাপগুলিতে বেশিরভাগ হার্ডওয়্যার দ্বারা সরবরাহ করা ক্যাশে সংহত গ্যারান্টি তৈরি করে। - শেষ নোট]
কোনও releaseস্টোরের কেবল নিজেই ফ্লাশ করার জন্য এবং কয়েকটি নির্বাচিত অ্যাড্রেস রেঞ্জগুলির কোনও ব্যবস্থা নেই : এটি সমস্ত কিছু সিঙ্ক করতে হবে কারণ যদি তাদের अधिগ্রহন-লোড এই রিলিজ-স্টোরটি দেখে তবে অন্য থ্রেডগুলি কী পড়তে পারে তা এটি জানেন না a রিলিজ-সিকোয়েন্স যা থ্রেড জুড়ে একটি ঘটনার আগে সম্পর্ক স্থাপন করে, গ্যারান্টি দিয়ে যে লেখার থ্রেড দ্বারা করা অ-পারমাণবিক ক্রিয়াকলাপগুলি এখন পড়া নিরাপদ। যদি না রিলিজ স্টোরের পরে তাদের আরও লেখা না থাকে ...) বা সংকলকরা হতে সত্যিই যে মাত্র কয়েক ক্যাশে লাইন প্রয়োজন অনিদ্রা প্রমাণ করার স্মার্ট।
সম্পর্কিত: আমার উত্তর কি মুভি + এমফেন্স NUMA- এ নিরাপদ? সুসংগত ভাগযুক্ত মেমরি ছাড়াই x86 সিস্টেমের অস্তিত্ব সম্পর্কে বিশদে চলে যায়। এছাড়াও সম্পর্কিত: একই স্থানে লোড / স্টোর সম্পর্কে আরও জানতে এআরএম-এ পুনরায় অর্ডারিং লোড এবং স্টোর ।
সেখানে হয় আমি অ সুসঙ্গত ভাগ করা মেমোরি সঙ্গে ক্লাস্টার মনে করি, কিন্তু তারা একক সিস্টেম-ইমেজ মেশিন নই। প্রতিটি সমন্বিত ডোমেন পৃথক কার্নেল চালায়, সুতরাং আপনি এটির জুড়ে একটি সি সি ++ প্রোগ্রামের থ্রেড চালাতে পারবেন না। পরিবর্তে আপনি প্রোগ্রামটির পৃথক দৃষ্টান্ত চালান (প্রতিটি নিজস্ব ঠিকানা স্পেস সহ: প্রতিটি ক্ষেত্রে পয়েন্টার অন্য ক্ষেত্রে বৈধ নয়)।
একে অপরের সাথে সুস্পষ্ট ফ্লাশের মাধ্যমে যোগাযোগ করার জন্য, আপনি সাধারণত এমপিআই বা অন্যান্য বার্তা-পাসিং এপিআই ব্যবহার করবেন যাতে প্রোগ্রামটি নির্দিষ্ট করে দেয় যে কোন রেঞ্জের ফ্লাশিং দরকার।
প্রকৃত হার্ডওয়্যার std::threadক্যাশে সুসংহত সীমানা জুড়ে চলে না :
কিছু সামঁজস্যহীন এআরএম চিপ ভাগ শারীরিক অ্যাড্রেস স্পেস কিন্তু অস্তিত্ব, না ভেতরের-ভাগ করে নেওয়ার যোগ্য ক্যাশে ডোমেনগুলি। সুতরাং সুসংগত না। (যেমন মন্তব্য থ্রেড একটি A8 কোর এবং কর্টেক্স-M3 TI তৈরি সিতারা AM335x মতো)।
তবে পৃথক কার্নেলগুলি সেই কোরগুলিতে চালিত হবে, এমন কোনও একক সিস্টেমের চিত্র নয় যা উভয় কোর জুড়ে থ্রেড চালাতে পারে। আমি কোনও সি ++ বাস্তবায়ন সম্পর্কে সচেতন নই যা std::threadসুসংগত ক্যাশে ছাড়াই সিপিইউ কোর জুড়ে থ্রেড চালায়।
বিশেষত এআরএমের জন্য, সমস্ত থ্রেড একই অভ্যন্তরীণ-ভাগযোগ্য ডোমেনে চালিত হয় তা ধরে নিয়ে জিসি এবং ঝনঝন কোড উত্পন্ন করে। আসলে, এআরএমভি 7 আইএসএ ম্যানুয়ালটি বলেছে
এই আর্কিটেকচার (এআরএমভি 7) এমন এক প্রত্যাশা নিয়ে লেখা হয়েছে যে একই অপারেটিং সিস্টেম বা হাইপারভাইজার ব্যবহারকারী সমস্ত প্রসেসর একই ইনার শেয়ারেবল শেয়ারেবিলিটি ডোমেইনে থাকে
সুতরাং পৃথক ডোমেনগুলির মধ্যে অবিচ্ছিন্ন অংশীদারি মেমরি কেবল আলাদা কার্নেলের অধীনে বিভিন্ন প্রক্রিয়াগুলির মধ্যে যোগাযোগের জন্য ভাগ করে নেওয়া মেমরি অঞ্চলগুলির স্পষ্ট সিস্টেম-নির্দিষ্ট ব্যবহারের জন্য একটি জিনিস।
কোডার -জেন ব্যবহার করে dmb ish(অভ্যন্তরীণ ভাগযোগ্য বাধা) বনাম dmb sy(সিস্টেম) মেমরির বাধাগুলি সেই সংকলকটিতে ব্যবহার করে এই কোরএলসিআরআর আলোচনাটিও দেখুন ।
আমি দৃser়ভাবে বলছি যে অন্য কোনও আইএসএর জন্য কোনও সি ++ বাস্তবায়ন std::threadঅ-সুসংহত ক্যাশেগুলি দিয়ে কোর জুড়ে চলে না। আমার কাছে প্রমাণ নেই যে এ জাতীয় কোনও বাস্তবায়ন নেই, তবে এটি অত্যন্ত অসম্ভব বলে মনে হচ্ছে। আপনি যদি এইচডব্লিউটির কোনও নির্দিষ্ট বিদেশী অংশকে লক্ষ্য না করে থাকেন তবে আপনার কর্মক্ষমতা সম্পর্কে আপনার চিন্তাভাবনাটি সমস্ত থ্রেডের মধ্যে এমইএসআই-এর মতো ক্যাশে সামঞ্জস্যতা গ্রহণ করা উচিত। (যথাযথভাবে atomic<T>নির্ভুলতার গ্যারান্টি দেয় এমন উপায়ে ব্যবহার করুন !)
সুসংগত ক্যাশে এটি সহজ করে তোলে
তবে সুসংগত ক্যাশে সমেত একাধিক-মূল সিস্টেমে রিলিজ-স্টোর বাস্তবায়ন করার অর্থ এই সুতার স্টোরগুলির জন্য ক্যাশে প্রতিশ্রুতিবদ্ধ আদেশ দেওয়া, কোনও স্পষ্টভাবে ফ্লাশিং না করা। ( https://preshing.com/20120913/acquire-and-release-semantics/ এবং https://preshing.com/20120710/ মেমরি- বারিয়ারস- are-like - source- control - operations/ )। (এবং অধিগ্রহণ-বোঝার অর্থ অন্য কোরে ক্যাশে অ্যাক্সেসের আদেশ দেওয়া)।
একটি মেমোরি বাধা নির্দেশ কেবল স্ট্রিম বাফার ড্রেন না হওয়া অবধি বর্তমান থ্রেডের বোঝা এবং / অথবা স্টোরগুলিকে অবরুদ্ধ করে; যা সর্বদা নিজেরাই সম্ভব দ্রুত ঘটে। ( কোনও মেমোরি বাধা কী নিশ্চিত করে যে ক্যাশে সংহতি সম্পন্ন হয়েছে? এই ভ্রান্ত ধারণাকে সম্বোধন করে)। সুতরাং আপনার যদি অর্ডার দেওয়ার দরকার না হয় তবে কেবল অন্যান্য থ্রেডে প্রম্পট দৃশ্যমানতা mo_relaxedঠিক আছে। (এবং তাই volatile, তবে তা করবেন না))
আরও দেখুন সি / সি ++ 11 প্রসেসর থেকে ম্যাপিং
মজাদার ঘটনা: x86-এ, প্রতিটি এসএম স্টোরই একটি রিলিজ-স্টোর কারণ x86 মেমরি মডেলটি মূলত সিক-সিএসটি প্লাস একটি স্টোর বাফার (স্টোর ফরোয়ার্ডিং সহ)।
আধা-সম্পর্কিত পুনরায়: স্টোর বাফার, গ্লোবাল দৃশ্যমানতা এবং সংহতি: C ++ 11 খুব সামান্য গ্যারান্টি দেয়। বেশিরভাগ আসল আইএসএগুলি (পাওয়ারপিসি ব্যতীত) গ্যারান্টি দেয় যে দুটি থ্রেড অন্য দুটি থ্রেড দ্বারা দুটি স্টোর উপস্থিতির ক্রমে সমস্ত থ্রেড একমত হতে পারে। (আনুষ্ঠানিক কম্পিউটার-আর্কিটেকচার মেমরি মডেল পরিভাষায়, তারা "মাল্টি-কপি অ্যাটমিক")।
অন্য একটি ভুল ধারণাটি হ'ল মেমোরি বেড়া asm নির্দেশাবলী আমাদের স্টোরগুলিকে দেখার জন্য অন্যান্য কোরগুলির জন্য স্টোর বাফারটি ফ্লাশ করতে হবে । প্রকৃতপক্ষে স্টোর বাফার যত তাড়াতাড়ি সম্ভব নিজেকে (এল 1 ডি ক্যাশে প্রতিশ্রুতিবদ্ধ) নিষ্কাশন করার চেষ্টা করছে, অন্যথায় এটি পূরণ করে এবং কার্যকর করা বন্ধ করে দেবে। স্টোর বাফারটি শুকানো না হওয়া পর্যন্ত একটি সম্পূর্ণ বাধা / বেড়া যা বর্তমান থ্রেডটিকে স্টল করে দেয় তাই আমাদের পরবর্তী স্টোরগুলির পরে আমাদের পরবর্তী ভারগুলি গ্লোবাল ক্রমে উপস্থিত হয়।
(x86 এর দৃ strongly়ভাবে অর্ডার করা এএসএম মেমোরি মডেলটির অর্থ হল যে volatileএক্স -86 on-এ আপনাকে আরও কাছাকাছি পৌঁছে দেবে mo_acq_rel, ব্যতীত অ-পারমাণবিক ভেরিয়েবলগুলির সাথে সংকলন-সময় পুনরায় ক্রমান্বিত হওয়া এখনও ঘটতে পারে But তবে বেশিরভাগ নন-এক্স ৮ weak মেমোরি মডেলগুলিকে দুর্বলভাবে অর্ডার করেছেন) volatileএবং relaxedপ্রায় হিসাবে দুর্বল mo_relaxed।)