আমি বেশ কয়েকটি নিবন্ধ, আলোচনা এবং স্ট্যাকওভারফ্লো প্রশ্নগুলি শুনেছি এবং পড়েছি std::atomic
এবং আমি নিশ্চিত হতে চাই যে আমি এটি ভালভাবে বুঝতে পেরেছি। কারণ আমি এখনও ক্যাশে লাইন নিয়ে কিছুটা বিভ্রান্ত হয়ে পড়েছি এমইএসআইতে সম্ভাব্য বিলম্বের কারণে (বা উত্পন্ন) ক্যাশে সংহতি প্রোটোকল, স্টোর বাফারস, সারিগুলি অবৈধ করে রাখা ইত্যাদি।
আমি পড়লাম x86 এর একটি শক্তিশালী মেমরির মডেল রয়েছে এবং ক্যাশে অবৈধকরণে দেরি হলে x86 শুরু করা ক্রিয়াকলাপগুলি ফিরিয়ে আনতে পারে। তবে আমি এখন কেবলমাত্র প্ল্যাটফর্মের স্বাধীনভাবে সি ++ প্রোগ্রামার হিসাবে আমার কী গ্রহণ করা উচিত সে সম্পর্কে আগ্রহী।
[টি 1: থ্রেড 1 টি 2: থ্রেড 2 ভি 1: শেয়ার করা পারমাণবিক পরিবর্তনশীল]
আমি বুঝতে পেরেছি যে std :: পারমাণবিক গ্যারান্টি দেয় যে,
(1) কোনও ভেরিয়েবলে কোনও ডেটা রেস হয় না (ক্যাশে লাইনে একচেটিয়া অ্যাক্সেসের জন্য ধন্যবাদ)।
(২) আমরা কোন মেমরি_অর্ডার ব্যবহার করি তার উপর নির্ভর করে এটি (বাধা সহ) গ্যারান্টি দেয় যে ক্রমিক ধারাবাহিকতা ঘটে (বাধার আগে, একটি বাধা বা উভয়ের পরে)।
(3) টি 1 এ পারমাণবিক লেখার (ভি 1) পরে, টি 2-তে একটি পারমাণবিক আরএমডাব্লু (ভি 1) সুসংগত হবে (এর ক্যাশে লাইন টি 1-তে লিখিত মান সহ আপডেট করা হবে)।
তবে ক্যাশে সংহতি প্রাইমারের উল্লেখ হিসাবে,
এই সমস্ত কিছুর অর্থ এই যে, ডিফল্টরূপে, লোডগুলি বাসি ডেটা আনতে পারে (যদি কোনও সম্পর্কিত অবৈধকরণের অনুরোধটি অবৈধতার সারিতে বসে থাকে)
সুতরাং, নিম্নলিখিতটি কি সঠিক?
(৪) std::atomic
টি গ্যারান্টি দেয় না যে টি 2 টি টি-তে একটি পারমাণবিক লেখার (ভি) পরে পরমাণু পাঠ (ভি) -র 'বাসি' মান পড়বে না।
প্রশ্নগুলি যদি (4) সঠিক হয়: টি 1-তে পারমাণবিক লিখন যদি দেরি না করেই ক্যাশে লাইনটিকে অকার্যকর করে দেয় তবে কেন পারমাণবিক আরএমডাব্লু অপারেশন করলে পারমাণবিক পাঠ না করে T2 অবৈধকরণ কার্যকর হওয়ার অপেক্ষায় থাকে?
(4) ভুল হলে প্রশ্নগুলি: কখন একটি থ্রেড একটি 'বাসি' মান এবং কার্যকর করতে "এটি দৃশ্যমান" পড়তে পারে, তাহলে?
আমি আপনার উত্তর অনেক প্রশংসা করি
আপডেট 1
সুতরাং মনে হয় আমি তখন ভুল ছিলাম (3)। প্রাথমিক ভি 1 = 0 এর জন্য নিম্নলিখিত ইন্টারলিওভটি কল্পনা করুন:
T1: W(1)
T2: R(0) M(++) W(1)
যদিও এই ক্ষেত্রে টি 2 এর আরএমডাব্লু সম্পূর্ণরূপে ডাব্লু (1) এর পরে ঘটবে তার গ্যারান্টিযুক্ত, এটি এখনও একটি 'বাসি' মান (আমার ভুল ছিল) পড়তে পারে। এর মতে, পারমাণবিক সম্পূর্ণ ক্যাশে একাত্মতার গ্যারান্টি দেয় না, কেবল ক্রমযুক্ত ধারাবাহিকতা।
আপডেট 2
(5) এখন এই উদাহরণটি কল্পনা করুন (x = y = 0 এবং এটি পারমাণবিক):
T1: x = 1;
T2: y = 1;
T3: if (x==1 && y==0) print("msg");
আমরা যে কথা বলেছি তার অনুসারে, স্ক্রিনে প্রদর্শিত "msg" দেখে আমাদের টি -২ এর পরে এক্স 2 কার্যকর করা হয়েছিল তার বাইরে তথ্য দেয় না। সুতরাং নিম্নলিখিত দুটি মৃত্যুদণ্ড কার্যকর হতে পারে:
- টি 1 <টি 3 <টি 2
- টি 1 <টি 2 <টি 3 (যেখানে টি 3 এক্স = 1 দেখেছে তবে এখনও y = 1 নয়)
এটা কি সঠিক?
()) যদি কোনও থ্রেড সর্বদা 'বাসি' মানগুলি পড়তে পারে, তবে আমরা সাধারণত "প্রকাশিত" দৃশ্যাবলীটি গ্রহণ করি তবে কিছু ডেটা প্রস্তুত রয়েছে এমন সিগন্যালের পরিবর্তে, আমরা ঠিক এর বিপরীতে করি (ডেটা মুছুন)?
T1: delete gameObjectPtr; is_enabled.store(false, std::memory_order_release);
T2: while (is_enabled.load(std::memory_order_acquire)) gameObjectPtr->doSomething();
যেখানে টি -2 টি এখনও মুছে ফেলা পিটিআর ব্যবহার করবে যতক্ষণ না দেখা যাচ্ছে যে_স্কৃত হয়েছে তা মিথ্যা।
()) এছাড়াও, থ্রেডগুলি 'বাসি' মানগুলি পড়তে পারে তার অর্থ একটি মুটেক্স কেবলমাত্র একটি লক-মুক্ত পরমাণু অধিকার দিয়ে প্রয়োগ করা যায় না? এটির জন্য থ্রেডগুলির মধ্যে একটি সমন্বয় ব্যবস্থা দরকার। এটির জন্য কী লকযোগ্য পারমাণবিক প্রয়োজন?