"দৃ strongly়তার আগে ঘটে" এর অর্থ কী?


9

"দৃ strongly়তার আগে ঘটে" এই শব্দটি C ++ খসড়া স্ট্যান্ডার্ডে বেশ কয়েকবার ব্যবহৃত হয় is

উদাহরণস্বরূপ: সমাপ্তি [বেসিক.স্টার্ট.টার্ম] / 5

স্ট্যাটিক স্টোরেজ সময়কাল সহ কোনও অবজেক্টের সূচনার কাজটি স্ট্যান্ড :: অ্যাকট্সিট (দেখুন, [সমর্থন.start.term]) কল করার আগে দৃ strongly়তার সাথে ঘটলে, ফাংশনটিতে কলটি std :: atexit এ পাস হয়েছে অবজেক্টের জন্য ডেস্ট্রাক্টরের কাছে কল দেওয়ার আগেই ক্রমযুক্ত। স্থিতিশীল স্টোরেজ সময়কাল সহ কোনও সামগ্রীর সূচনা শেষ হওয়ার আগে যদি std :: axxit এ কলটি দৃ strongly়তার সাথে ঘটে, তবে স্টাড :: অ্যাটেক্সিটে ফাংশনটিতে কল করার আগে অবজেক্টের জন্য ডেস্ট্রাক্টরকে কল করা হবে । যদি std :: axxit এ কলটি std :: axxit এ অন্য কল করার আগে দৃ strongly়ভাবে ঘটে, ফাংশনটিতে কলটি দ্বিতীয় স্টাডকে পাস করেছে :: atexit কলটি ফাংশনটিতে কল পাঠানোর আগেই ক্রমবর্ধমান হয় first std :: atexit কল।

এবং ডেটা রেসগুলিতে সংজ্ঞায়িত [অন্তর্ভুক্তিগুলি] / 12

একটি মূল্যায়ন একটি মূল্যায়ন D এর আগে শক্তভাবে ঘটে যদি হয়, তবে

(12.1) এ ডি এর আগে ক্রমযুক্ত, বা

(১২.২) ডি এর সাথে একটি সিঙ্ক্রোনাইজ হয় এবং এ এবং ডি উভয়ই পরম্পরাগত পারমাণবিক ক্রিয়াকলাপ ([পারমাণবিক.অর্ডার]), বা

(১২.৩) বি এবং সি এর মূল্যায়ন রয়েছে যে বি এর আগে এ সিকোয়েন্সড হয়, বি এর আগে সি এর আগে হয়, এবং সি ডি এর আগে সিকোয়েন্সড হয়, বা

(১২.৪) বি এর এমন একটি মূল্যায়ন রয়েছে যা খ এর আগে একটি শক্তভাবে ঘটে, এবং ডি এর আগে খ দৃ strongly়ভাবে ঘটে B

[দ্রষ্টব্য: অনানুষ্ঠানিকভাবে, যদি বি এর আগে একটি দৃ strongly়ভাবে ঘটে, তবে A সমস্ত ক্ষেত্রেই বি এর আগে মূল্যায়ন করা হবে বলে মনে হয়। ক্রিয়াকলাপ গ্রহণের অপারেশন বাদ দেওয়ার আগে দৃ St়ভাবে ঘটে happens - শেষ নোট]

"দৃ strongly়ভাবে ঘটে যাওয়ার আগে" কেন চালু হয়েছিল? স্বজ্ঞাতভাবে, "এর আগে ঘটে" এর সাথে এর পার্থক্য এবং সম্পর্ক কী?

নোটটিতে "A এর আগে সমস্ত ক্ষেত্রে মূল্যায়ন করা হবে" এর অর্থ কী?

(দ্রষ্টব্য: এই প্রশ্নের অনুপ্রেরণা হ'ল এই উত্তরের অধীনে পিটার কর্ডেসের মন্তব্য ))

অতিরিক্ত খসড়া স্ট্যান্ডার্ড উদ্ধৃতি (পিটার কর্ডসকে ধন্যবাদ)

অর্ডার এবং ধারাবাহিকতা [অ্যাটমিক্স.অর্ডার] / ৪

সমস্ত মেমোরিঅর্ডার :: একক মোট অর্ডার এস রয়েছে বেড়া সহ, seq_cst অপারেশনগুলি, যা নিম্নলিখিত সীমাবদ্ধতাগুলি পূরণ করে। প্রথমত, যদি A এবং B মেমরি_আর্ডার :: seq_cst ক্রিয়াকলাপ হয় এবং A এর আগে বি এর আগে দৃ happens়রূপে ঘটে থাকে, তবে এস এর আগে একটি দ্বিতীয় বি, একটি বস্তু M এর প্রতিটি জোড়ের A এবং B এর জন্য, যেখানে A একত্রিত-আদেশযুক্ত খ এর আগে নিম্নলিখিত চারটি শর্ত এস এর দ্বারা সন্তুষ্ট হওয়া দরকার:

(৪.১) যদি ক এবং বি উভয়ই মেমোরি অর্ডার :: seq_cst ক্রিয়াকলাপ হয়, তবে এস এর আগে পূর্ববর্তী বি; এবং

(৪.২) যদি A একটি মেমোরি অর্ডার :: seq_cst অপারেশন হয় এবং বি একটি মেমোরি_র্ডার :: seq_cst বেড়া ওয়াইয়ের আগে ঘটে থাকে, তবে এস এর আগে পূর্ববর্তী Y; এবং

(৪.৩) যদি একটি মেমরি_র্ডার :: seq_cst বেড়া এক্স হয় A এবং B এর আগে মেমোরি অর্ডার :: seq_cst ক্রিয়াকলাপ, তারপরে এক্স এর পূর্বে এস; এবং

(৪.৪) যদি একটি মেমরি_র্ডার :: seq_cst বেড়া এক্সটি A এবং B এর আগে মেমরি_অর্ডার :: seq_cst বেড়া Y এর আগে ঘটে, তবে এক্স এর আগে এস এর


1
বর্তমান খসড়া মান এছাড়াও রেফারেন্স "একজন জোরালোভাবে বি সামনে ঘটে" একটি শাসন আবেদন করার জন্য একটি শর্ত হিসাবে seq_cst, এ Atomics 31.4 অর্ডার এবং দৃঢ়তা: 4 । এটি সি ++ ১ n এন 659৫৯ স্ট্যান্ডার্ডে নেই, যেখানে 32.4 - 3 সমস্ত প্রভাবিত জায়গাগুলির জন্য "পূর্বে ঘটে" আদেশ এবং সংশোধন আদেশের সাথে সামঞ্জস্য রেখে seq_cst অপের একক সামগ্রিক ক্রমটির অস্তিত্ব নির্ধারণ করে ; "দৃ strongly়ভাবে" পরবর্তী খসড়ায় যুক্ত করা হয়েছিল।
পিটার

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


@ আইলিনোটেক্সিস্ট ইডোনোটেক্সিস্ট আপনি কি এমটি প্রোগ্রাম থেকে বেরিয়ে আসতে পারেন? এটি কি মূলত ভাঙ্গা ধারণা নয়?
কৌতূহলী

1
@curiousguy যে এর উদ্দেশ্য exit()যে কোনও থ্রেড প্রস্থান করে পুরো প্রোগ্রামটিকে মেরে ফেলতে পারে, বা মূল থ্রেড বাই-বাই returnছাড়তে পারে। এটি atexit()হ্যান্ডলারের কল এবং সমস্ত থ্রেডের মৃত্যুর ফলাফল যা তারা করছে।
Iwillnotexist আইডোনোটেক্সবাদ

উত্তর:


5

"দৃ strongly়ভাবে ঘটে যাওয়ার আগে" কেন চালু হয়েছিল? স্বজ্ঞাতভাবে, "এর আগে ঘটে" এর সাথে এর পার্থক্য এবং সম্পর্ক কী?

"কেবল ঘটে-আগে" জন্য নিজেকে ব্রেস করুন! সিপ্রেফের বর্তমান স্ন্যাপশটটি একবার দেখুন https://en.cppreferences.com/w/cpp/atomic/memory_order

এখানে চিত্র বর্ণনা লিখুন

দেখে মনে হচ্ছে সি ++ 20 এ "কেবল ঘটে-আগে" যুক্ত করা হয়েছে।

কেবল-আগে ঘটে

থ্রেড নির্বিশেষে, মূল্যায়ন একটি নিম্নরূপ মূল্যায়ন বি এর আগে ঘটে যায় যদি নীচের কোনওটি সত্য হয়:

1) ক খ এর আগে সিকোয়েন্সড হয়

2) একটি সিঙ্ক্রোনাইজ করে-বি

৩) এক্স এর আগে একটি সাধারণভাবে ঘটে এবং বি এর আগে এক্স কেবল ঘটে

দ্রষ্টব্য: গ্রাহক অপারেশন ব্যতীত, কেবল-আগে এবং ঘটে-এর আগে সম্পর্কগুলি একই রকম হয়।

সুতরাং কীভাবে তারা গ্রাহক ক্রিয়াকলাপ পরিচালনা করে তা ছাড়া কেবল-এইচবি এবং এইচবি একই are এইচবি দেখুন

হ্যাপেনস-পূর্বে

থ্রেড নির্বিশেষে, মূল্যায়ন A এর আগে-আগে মূল্যায়ন বি হয় তবে নিম্নলিখিতগুলির কোনওটি সত্য হলে:

1) ক খ এর আগে সিকোয়েন্সড হয়

2) একটি আন্তঃ থ্রেড বি এর আগে ঘটে

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

সেবন সম্পর্কে তারা কীভাবে আলাদা? আন্ত-থ্রেড-এইচবি দেখুন

আন্ত-থ্রেড-এর আগে ঘটে

থ্রেডের মধ্যে, মূল্যায়ন নীচের কোনওটি সত্য হলে মূল্যায়ন বিয়ের আগে একটি আন্ত-থ্রেড ঘটে

1) একটি সিঙ্ক্রোনাইজ করে-বি

2) ক খ এর আগে নির্ভরতা অর্ডার করা হয়

3) ...

...

নির্ভরতা অর্ডার করা একটি অপারেশন (অর্থাত মুক্তি / গ্রাহক ব্যবহার করে) এইচবি হয় তবে অগত্যা সহজভাবে-এইচবি নয়।

গ্রাহক অধিগ্রহণের চেয়ে বেশি স্বাচ্ছন্দ্যযুক্ত, তাই যদি আমি সঠিকভাবে বুঝতে পারি তবে এইচবি সিম্পল-এইচবির চেয়ে বেশি স্বাচ্ছন্দ্যযুক্ত।

দৃr়ভাবে ঘটে-আগে

থ্রেড নির্বিশেষে, মূল্যায়ন একটি দৃ strongly়ভাবে ঘটে - মূল্যায়নের আগে বি এর নিম্নলিখিতগুলির কোনওটি সত্য হয়:

1) ক খ এর আগে সিকোয়েন্সড হয়

2) বি এর সাথে একটি সিঙ্ক্রোনাইজ হয় এবং এ এবং বি উভয়ই পরম্পরাগত পারমাণবিক ক্রিয়াকলাপ

৩) এ এক্স এর আগে সিকোয়েন্সড হয়, এক্স কেবল ওয়াই এর আগে হয়, এবং বি এর আগে ওয়াই সিকোয়েন্সড হয়

৪) এক্স এর আগে একটি জোরালোভাবে ঘটে এবং এক্স এর আগে বি এর আগে ঘটে

দ্রষ্টব্য: অনানুষ্ঠানিকভাবে, যদি একটি শক্তভাবে বি এর আগে ঘটে থাকে, তবে A সমস্ত ক্ষেত্রেই বি এর আগে মূল্যায়ন করা হবে বলে মনে হয়।

দ্রষ্টব্য: গ্রাহক ক্রিয়াকলাপ বাদ দেওয়ার আগে দৃ strongly়ভাবে ঘটে।

সুতরাং একটি রিলিজ / গ্রাহক অপারেশন স্ট্রংলি-এইচবি হতে পারে না।

রিলিজ / অর্জন এইচবি এবং সিম্প্লি-এইচবি হতে পারে (কারণ রিলিজ / সিঙ্ক্রোনাইজ-সাথে অর্জন) তবে অগত্যা স্ট্রংলি-এইচবি নয়। কারণ স্ট্রংলি-এইচবি স্পষ্টভাবে বলেছে যে এটিকে অবশ্যই বি এর সাথে সিঙ্ক্রোনাইজ করা উচিত এবং একটি পরম্পরাগত ধারাবাহিক অপারেশন হতে হবে।

                            Is happens-before guaranteed?

                        HB             Simply-HB          Strongly-HB

relaxed                 no                 no                 no
release/consume        yes                 no                 no      
release/acquire        yes                yes                 no
S.C.                   yes                yes                yes

নোটটিতে "A এর আগে সমস্ত ক্ষেত্রে মূল্যায়ন করা হবে" এর অর্থ কী?

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

কেন জানি স্ট্রংলি-এইচবি এবং সিম্পলি-এইচবি চালু হয়েছিল? প্রায়শই কীভাবে ব্যবহার করতে হয় তা স্পষ্ট করতে সহায়তা করতে পারে? দৃr়রূপে এইচবিতে একটি দুর্দান্ত বৈশিষ্ট্য রয়েছে - যদি একটি থ্রেড একটি দৃ -়ভাবে ঘটে যায়-বি এর আগে, এটি জানে যে সমস্ত থ্রেড একই জিনিস পালন করবে।

গ্রাসের ইতিহাস:

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


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

পুনঃ গ্রাস আপনি কি দাবি করেন যে গ্রাহক অর্ডার দেওয়ার ভাগ্যটি ডিসি আলফার ভাগ্যের সাথে যুক্ত এবং সেই নির্দিষ্ট খিলানের বাইরে কোনও মূল্য নেই?
কৌতূহলী

1
এটা একটা ভালো প্রশ্ন. এটি আরও বেশি খতিয়ে দেখলে মনে হয় যে গ্রাহক তাত্ত্বিকভাবে এআরএম এবং পাওয়ারপিসির মতো দুর্বলভাবে অর্ডার করা খিলানগুলির জন্য একটি পারফরম্যান্স বাড়া দিতে পারে। আমাকে এটি দেখার জন্য আরও কিছু সময় দিন।
হামফ্রে

1
আমি বলতে পারি যে আলফা ব্যতীত সমস্ত দুর্বলভাবে অর্ডারপ্রাপ্ত আইএসএর কারণে গ্রাহক উপস্থিত রয়েছে । আলফা আসমে কেবলমাত্র বিকল্পগুলি শিথিল করা হয় এবং অর্জন করা হয় (এবং সিক-সিএসটি), নির্ভরতা ক্রম নয় not mo_consumeআসল সিপিইউগুলিতে ডেটা নির্ভরতা অর্ডার করার সুবিধা গ্রহণ করার উদ্দেশ্যে এবং আনুষ্ঠানিকভাবে তৈরি করা হয় যে সংকলকটি শাখার পূর্বাভাসের মাধ্যমে ডেটা নির্ভরতা ভঙ্গ করতে পারে না। উদাহরণস্বরূপ int *p = load(); tmp = *p;সংকলক প্রবর্তন করে ভেঙে যেতে পারে if(p==known_address) tmp = *known_address; else tmp=*p;যদি নির্দিষ্ট পয়েন্টারের মানটি সাধারণ হওয়ার প্রত্যাশার কিছু কারণ থাকে। এটি স্বাচ্ছন্দ্যের জন্য আইনী তবে গ্রাস নয়।
পিটার

@ পিটারকর্ডস ডান ... দুর্বল ক্রমযুক্ত খিলানগুলি অর্জনের জন্য একটি স্মৃতি বাধা নির্গত করতে হবে, তবে (তাত্ত্বিকভাবে) গ্রাস করার জন্য নয়। দেখে মনে হচ্ছে আপনি যদি মনে করেন যে আলফা যদি না থাকত তবে আমরা এখনও গ্রাস করতাম? এছাড়াও, আপনি মূলত বলছেন যে গ্রাহকতা অভিনব (বা "স্ট্যান্ডার্ড") সংকলক বাধা।
হামফ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.