c++ - উনল - সি++ 11 একটি মানসম্মত মেমরি মডেল চালু। এর মানে কী? এবং কিভাবে এটা সি++ প্রোগ্রামিং প্রভাবিত করবে?




সি++ বই (4)

আপনি যদি আপনার সমস্ত ডেটা সুরক্ষার জন্য মু्यूटক্সগুলি ব্যবহার করেন তবে আপনাকে অবশ্যই চিন্তা করতে হবে না। Mutexes সবসময় যথেষ্ট আদেশ এবং দৃশ্যমানতা গ্যারান্টি প্রদান করেছেন।

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

পূর্বে, পারমাণবিক কম্পাইলার intrinsics, অথবা কিছু উচ্চ স্তরের লাইব্রেরি ব্যবহার করা হবে। বাউন্স নির্দিষ্ট নির্দেশাবলী (মেমরি বাধা) ব্যবহার করে সম্পন্ন করা হয়েছে।

সি ++ 11 একটি মানসম্মত মেমরি মডেল চালু, কিন্তু ঠিক যে মানে কি? এবং কিভাবে এটা সি ++ প্রোগ্রামিং প্রভাবিত করবে?

এই নিবন্ধটি ( হ্যারিব সটারের উদ্ধৃতি দিয়ে গেভিন ক্লার্কের ) বলেছেন যে,

মেমরি মডেল মানে C ++ কোডটি এখন একটি মানককৃত লাইব্রেরি আছে যা নির্মাতা এবং কোন প্ল্যাটফর্মটি চলছে তা নির্বিশেষে কল করতে। বিভিন্ন থ্রেড প্রসেসর এর মেমরিতে কীভাবে কথা বলার জন্য একটি আদর্শ উপায় রয়েছে।

"যখন আপনি মানচিত্রে বিভিন্ন কোডের মধ্যে [কোড] বিভাজন করার কথা বলছেন, তখন আমরা মেমরি মডেল সম্পর্কে কথা বলছি। আমরা এই কোডটি তৈরি করতে নিম্নলিখিত ধাপগুলি ভঙ্গ করেই এটিটি অপ্টিমাইজ করতে যাচ্ছি," বলেছেন সুটার

আচ্ছা, আমি এই এবং একই অনুচ্ছেদগুলি অনলাইনে উপলব্ধ করতে পারি (আমার জন্মের পর থেকে আমার নিজের মেমরি মডেল ছিল: P) এবং অন্যদের দ্বারা জিজ্ঞাসিত প্রশ্নাবলীর উত্তর হিসাবে পোস্ট করতে পারি, কিন্তু সৎ হতে, আমি ঠিক বুঝতে পারছি না এই.

সি ++ প্রোগ্রামারগুলি এমনকি বহু আগে থ্রেডেড অ্যাপ্লিকেশনগুলি বিকাশের জন্য ব্যবহার করেছিল, সুতরাং এটি কীভাবে পজিশ্স থ্রেড, অথবা উইন্ডোজ থ্রেড, অথবা সি ++ 11 থ্রেডগুলি কীভাবে গুরুত্বপূর্ণ? লাভ কি কি? আমি নিম্ন স্তরের বিবরণ বুঝতে চান।

আমি এই অনুভূতিটিও পেয়েছি যে C ++ 11 মেমরি মডেলটি যে কোনভাবেই C ++ 11 মাল্টি-থ্রেডিং সমর্থন সম্পর্কিত, আমি প্রায়শই এই দুইটিকে একসাথে দেখি। যদি এটা হয়, ঠিক কিভাবে? কেন তারা সম্পর্কিত করা উচিত?

আমি জানি না যে মাল্টি-থ্রেডিংয়ের অভ্যন্তরীণ অভ্যন্তরীণ কাজগুলি কীভাবে এবং কোন মেমরি মডেলটি সাধারণভাবে বোঝায়, দয়া করে আমাকে এই ধারণাগুলি বুঝতে সহায়তা করুন। :-)


আমি কেবলমাত্র সাদৃশ্য দেব যা আমি মেমরি সামঞ্জস্য মডেল (বা স্বল্প সময়ের জন্য মেমরি মডেল) বুঝতে পারি। এটি লেসলি ল্যামপোর্টের মৌলিক কাগজ "টাইম, ক্লকস, এবং একটি বিতরিত সিস্টেমের ইভেন্টস অফ অর্ডার" দ্বারা অনুপ্রাণিত। উপমা উপযুক্ত এবং মৌলিক তাত্পর্য আছে, কিন্তু অনেক মানুষের জন্য overkill হতে পারে। যাইহোক, আমি আশা করি এটি একটি মানসিক চিত্র (একটি চিত্রিত উপস্থাপনা) সরবরাহ করে যা মেমরি সামঞ্জস্য মডেল সম্পর্কে যুক্তি তৈরি করে।

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

"মেমরি কনজিস্টেন্সি এবং ক্যাশে সংহতি একটি Primer" থেকে উদ্ধৃত

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

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

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

[উইকিপিডিয়া থেকে ছবি]

আইনস্টাইনের আপেক্ষিক বিশেষ তত্ত্ব সম্পর্কিত পাঠকগুলি লক্ষ্য করবেন যে আমি কী বলছি। মিনকোস্কির শব্দগুলি মেমরি মডেলের ক্ষেত্রে অনুবাদ করা হচ্ছে: ঠিকানা স্থান এবং সময় ঠিকানা-স্থান-সময়গুলির ছায়া। এই ক্ষেত্রে, প্রতিটি পর্যবেক্ষক (অর্থাত্, থ্রেড) ইভেন্টের ছায়াগুলি (অর্থাৎ, মেমরি স্টোর / লোড) নিজের বিশ্ব-লাইনে (অর্থাৎ, তার সময় অক্ষ) এবং একযোগে তার সমতল (তার ঠিকানা-স্থান অক্ষ) । C ++ 11 মেমরি মডেলের থ্রেডগুলি পর্যবেক্ষকদের সাথে সম্পর্কিত যা বিশেষ আপেক্ষিকতার সাথে একে অপরের সাথে সম্পর্কিত হয়। ক্রমিক ধারাবাহিকতা গ্যালিলিয়ানের স্থানকালের সাথে সম্পর্কিত (অর্থাত্, সমস্ত পর্যবেক্ষক ঘটনাগুলির এক পরম ক্রম এবং একযোগে বিশ্বব্যাপী ইন্দ্রিয়ের সাথে একমত)।

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

আপেক্ষিকতার মধ্যে, কিছু আদেশ আংশিকভাবে আদেশিত ঘটনাগুলির আপাতদৃষ্টিতে বিশৃঙ্খল ছবিতে পুনরুদ্ধার করা হয়, যেহেতু সমস্ত পর্যবেক্ষক একযোগে "টাইমলাইক" ইভেন্টগুলির মধ্যে ক্রমবর্ধমান একমাত্র সাময়িক ক্রম (অর্থাৎ, যে ঘটনাগুলি কোনও কণার ধীরে ধীরে ধীরে ধীরে সংযোগযোগ্য একটি ভ্যাকুয়াম আলো আলোর চেয়ে)। শুধুমাত্র timelike সম্পর্কিত ঘটনা invariantly আদেশ করা হয়। পদার্থবিদ্যা সময়, ক্রেগ Callender

সি ++ 11 মেমরি মডেলে, একই স্থানীয় প্রক্রিয়াটি (অধিগ্রহণ মুক্তির সামঞ্জস্য মডেল) এই স্থানীয় কার্যকারিতা সম্পর্ক স্থাপন করার জন্য ব্যবহার করা হয়।

মেমরি সামঞ্জস্য সংজ্ঞা এবং এসসি পরিত্যাগ করার জন্য একটি প্রেরণা সংজ্ঞা দিতে, আমি "মেমরি কনজিস্টেন্সি এবং ক্যাশে সংহতি একটি Primer" উদ্ধৃত করা হবে

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

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

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

ক্যাশে সঙ্গতি এবং মেমরি সামঞ্জস্য কখনও কখনও বিভ্রান্ত হয়, কারণ এই উদ্ধৃতি এছাড়াও নির্দেশমূলক হয়:

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

আমাদের মানসিক ছবিটি চালিয়ে যাওয়ার সাথে সাথে, SWMR invariant শারীরিক প্রয়োজনের সাথে সংশ্লিষ্ট যেটি কোনও অবস্থানে অবস্থিত এক কণাতে অবস্থিত তবে কোনও অবস্থানের পর্যবেক্ষকদের সীমাহীন সংখ্যা থাকতে পারে।


প্রথমত, আপনাকে একজন ভাষা আইনজীবী মনে করতে শিখতে হবে।

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

সি ++ 98 / সি ++ 03 স্পেসিফিকেশন মধ্যে বিমূর্ত মেশিন মৌলিকভাবে একক-থ্রেডেড। সুতরাং বহু-থ্রেডযুক্ত C ++ কোড লিখতে পারছে না যা স্পষ্টের সাথে "পুরোপুরি পোর্টেবল"। স্মৃতি এমনকি মেমরি লোড এবং স্টোরের অটোমেটিকতা বা লোড এবং স্টোরগুলি হতে পারে এমন আদেশ সম্পর্কে কিছু বলে না, নিঃশব্দ মত জিনিসগুলি মনে রাখে না।

অবশ্যই, আপনি বিশেষ কংক্রিট সিস্টেমের জন্য প্র্যাকটিসে মাল্টি-থ্রেডেড কোড লিখতে পারেন - যেমন পিথ্রেড বা উইন্ডোজ। কিন্তু C ++ 98 / C ++ 03 এর জন্য মাল্টি-থ্রেডেড কোড লেখার কোনও আদর্শ উপায় নেই।

সি ++ 11 এ বিমূর্ত মেশিন নকশা দ্বারা মাল্টি-থ্রেডেড। এটি একটি ভাল সংজ্ঞায়িত মেমরি মডেল আছে ; অর্থাৎ, এটি মেমরি অ্যাক্সেস করার সময় কম্পাইলার কি করতে পারে এবং নাও করতে পারে তা বলে।

নিচের উদাহরণটি বিবেচনা করুন, যেখানে বৈশ্বিক ভেরিয়েবলগুলির একটি জোড়া দুটি থ্রেড দ্বারা সমানভাবে অ্যাক্সেস করা হয়:

           Global
           int x, y;

Thread 1            Thread 2
x = 17;             cout << y << " ";
y = 37;             cout << x << endl;

থ্রেড 2 আউটপুট কি হতে পারে?

সি ++ 98 / সি ++ 03 এর অধীনে, এটি এমনকি অনির্ধারিত আচরণ নয়; প্রশ্ন নিজেই অর্থহীন কারণ মান "থ্রেড" নামে কোনও চিন্তাভাবনা করে না।

সি ++ 11 এর অধীনে, ফলাফলটি অনির্ধারিত আচরণ, কারণ লোড এবং স্টোরগুলি সাধারণভাবে পারমাণবিক নয়। যা কোন উন্নতির মতো মনে হয় না ... এবং নিজের দ্বারা, এটি নয়।

কিন্তু সি ++ 11 দিয়ে আপনি এটি লিখতে পারেন:

           Global
           atomic<int> x, y;

Thread 1                 Thread 2
x.store(17);             cout << y.load() << " ";
y.store(37);             cout << x.load() << endl;

এখন জিনিস আরো আকর্ষণীয় পেতে। সর্বোপরি, এখানে আচরণ সংজ্ঞায়িত করা হয় । থ্রেড 2 এখন 0 0 প্রিন্ট করতে পারে (যদি এটি থ্রেড 1 এর আগে সঞ্চালিত হয়), 37 17 (এটি থ্রেড 1 এর পরে সঞ্চালিত হয়), অথবা 0 17 (যদি এটি থ্রেড 1 এর পরে x তে বরাদ্দ থাকে তবে এটি y এর আগে নির্ধারিত হয়)।

এটি মুদ্রণ করা যাবে না 37 0 , কারণ সি ++ 11 এ পারমাণবিক লোড / স্টোরগুলির জন্য ডিফল্ট মোড ক্রমিক সামগ্রিকতা প্রয়োগ করা। এর অর্থ এই যে সমস্ত লোড এবং স্টোরগুলি অবশ্যই "যেমনটি" প্রতিটি থ্রেডের মধ্যে আপনি যাতে ক্রমে লিখেছেন তাতেই ঘটে, যখন থ্রেডগুলির মধ্যে ক্রিয়াকলাপগুলি আটকানো যেতে পারে তবে সিস্টেমটি পছন্দ করে। সুতরাং পারমাণবিক ডিফল্ট আচরণ লোড এবং স্টোর উভয় পরমাণু এবং আদেশ প্রদান করে।

এখন, একটি আধুনিক CPU এ, ধারাবাহিক ধারাবাহিকতা নিশ্চিত করা ব্যয়বহুল হতে পারে। বিশেষ করে, কম্পাইলার এখানে প্রতিটি অ্যাক্সেসের মধ্যে সম্পূর্ণ ফুটো মেমরি বাধা নির্গমন সম্ভবত। কিন্তু যদি আপনার অ্যালগরিদম আউট অফ অর্ডার লোড এবং স্টোর সহ্য করতে পারে; অর্থাৎ, যদি এটি পারমাণবিকতা প্রয়োজন কিন্তু আদেশ না; অর্থাৎ, যদি এটি প্রোগ্রাম থেকে আউটপুট হিসাবে 37 0 সহ্য করতে পারে, তাহলে আপনি এটি লিখতে পারেন:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_relaxed);   cout << y.load(memory_order_relaxed) << " ";
y.store(37,memory_order_relaxed);   cout << x.load(memory_order_relaxed) << endl;

সিপিএর আরও আধুনিক, আগের তুলনায় এটি দ্রুততর হতে পারে।

অবশেষে, যদি আপনাকে নির্দিষ্ট লোড এবং স্টোরগুলি ঠিক রাখতে হয় তবে আপনি লিখতে পারেন:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_release);   cout << y.load(memory_order_acquire) << " ";
y.store(37,memory_order_release);   cout << x.load(memory_order_acquire) << endl;

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

অবশ্যই, যদি আপনি দেখতে চান শুধুমাত্র আউটপুট 0 0 বা 37 17 , আপনি মূল কোড কাছাকাছি একটি mutex মোড়ানো পারেন। কিন্তু যদি আপনি এই পর্যন্ত পড়েন তবে আমি নিশ্চিত যে আপনি কীভাবে এটি কাজ করেন তা ইতিমধ্যেই জানেন এবং এই উত্তরটি আমি আগে চেয়ে চেয়েছি: -)।

সুতরাং, নিচের লাইন। Mutexes দুর্দান্ত, এবং C ++ 11 তাদের মান্য করে। কিন্তু কখনও কখনও কর্মক্ষমতা কারণে আপনি নিম্ন স্তরের primitives (উদাহরণস্বরূপ, ক্লাসিক ডবল চেক লকিং প্যাটার্ন ) চান। নতুন মানটি উচ্চ-স্তরের গ্যাজেটগুলিকে মু्यूटক্স এবং শর্ত ভেরিয়েবল সরবরাহ করে এবং এটি কম-স্তরের গ্যাজেটগুলি প্রদান করে যেমন পারমাণবিক প্রকার এবং মেমরি বাধাগুলির বিভিন্ন স্বাদ। তাই এখন আপনি আদর্শ দ্বারা নির্দিষ্ট ভাষাতে সম্পূর্ণরূপে উচ্চতর পারফরম্যান্স সমান্তরাল রুটিন লিখতে পারেন এবং আপনি নিশ্চিত হতে পারেন যে আপনার কোডটি সংকলন করবে এবং আজকের সিস্টেম এবং আগামীকালের উভয় ক্ষেত্রেই অপরিবর্তিত থাকবে।

যদিও আপনি কোনও বিশেষজ্ঞ না হন এবং কিছু গুরুতর নিম্ন-স্তরের কোডে কাজ না করেন তবে আপনি সম্ভবত mutexes এবং শর্ত ভেরিয়েবলগুলিতে থাকা উচিত। আমি কি করতে ইচ্ছুক।

এই স্টাফ উপর আরো জন্য, এই ব্লগ পোস্ট দেখুন


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

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

আগ্রহজনকভাবে, সি ++ এর জন্য মাইক্রোসফ্ট কম্পাইলারগুলি সিএটি ++ এ একটি মেমরি মডেলের অভাবের সাথে মোকাবিলা করার জন্য সি ++ এক্সটেনশানটি অস্থিরতার জন্য স্যাম্যান্টিকগুলি অর্জন / প্রকাশ করেছে। http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx । যাইহোক, উইন্ডোজ শুধুমাত্র x86 / x64 তে চালিত, এটি অনেক বেশি বলছে না (ইন্টেল এবং এএমডি মেমরি মডেলগুলি একটি ভাষাতে অ্যাক্সেস / রিলিজ সেম্যান্টিক্স প্রয়োগ করতে এটি সহজ এবং দক্ষ করে তোলে)।





memory-model