ঔষধি এর উত্তর (আগেই সম্পাদিত হয়েছে) প্রকৃতপক্ষে একটি টাইপ যা একটি ভাল উদাহরণ দিলেন করা উচিত নয় অস্থাবর হতে: std::mutex
।
ওএসের নেটিভ মিটেক্স টাইপ (যেমন pthread_mutex_t
পসিক্স প্ল্যাটফর্মগুলিতে) "অবস্থানের আক্রমণকারী" নাও হতে পারে যার অর্থ বস্তুর ঠিকানা তার মানটির অংশ of উদাহরণস্বরূপ, ওএস সমস্ত প্রারম্ভিক মুটেক্স অবজেক্টের পয়েন্টারগুলির একটি তালিকা রাখতে পারে। যদি std::mutex
কোনও ডেটা সদস্য হিসাবে একটি নেটিভ ওএস মিউটেক্স টাইপ থাকে এবং নেটিভ টাইপের ঠিকানা অবশ্যই স্থির থাকে (কারণ ওএস তার মিউটেক্সগুলিতে পয়েন্টারগুলির একটি তালিকা বজায় রাখে) তবে হয় std::mutex
নেটিভ মিটেক্স টাইপটি গাদাতে সংরক্ষণ করতে হবে যাতে এটি স্থির থাকে would std::mutex
বস্তুগুলির মধ্যে স্থানান্তরিত করার সময় একই অবস্থান বা নড়াচড়া করতে std::mutex
হবে না। এটি স্তূপে সংরক্ষণ করা সম্ভব নয়, কারণ একজনের std::mutex
একজন constexpr
কনস্ট্রাক্টর রয়েছে এবং অবশ্যই ধ্রুবক সূচনা (যেমন স্ট্যাটিক ইনিশিয়ালাইজেশন) এর জন্য যোগ্য হতে হবে যাতে একটি গ্লোবালstd::mutex
প্রোগ্রামটির সম্পাদন শুরু হওয়ার আগেই নির্মাণের গ্যারান্টিযুক্ত, সুতরাং এর নির্মাণকারী ব্যবহার করতে পারবেন না new
। সুতরাং std::mutex
অস্থাবর জন্য একমাত্র বিকল্প বাকি ।
একই যুক্তি অন্যান্য ধরণের ক্ষেত্রেও প্রযোজ্য যার মধ্যে এমন কোনও নির্দিষ্ট ঠিকানা রয়েছে। যদি উত্সের ঠিকানা স্থির থাকতেই হয় তবে তা সরাবেন না!
না সরানোর জন্য আরও একটি যুক্তি রয়েছে std::mutex
যা এটি নিরাপদে করা খুব কঠিন হবে কারণ আপনার জানা দরকার যে নুন মুভেক্সকে স্থানান্তরিত করার মুহুর্তে লক করার চেষ্টা করছেন। যেহেতু ডেটা দৌড় প্রতিরোধের জন্য মুটেক্সগুলি আপনি যে বিল্ডিং ব্লকগুলি ব্যবহার করতে পারেন তার মধ্যে একটি হ'ল, যদি তারা নিজেরাই ঘোড়দৌড়ের বিরুদ্ধে সুরক্ষিত না হত তবে দুর্ভাগ্য হবে! একটি অস্থাবর সাথে std::mutex
আপনি জানেন যে এটি তৈরির পরে এবং এটি ধ্বংস হওয়ার আগে যে কেউ কেবল এটির জন্য কাজ করতে পারে তা হ'ল লক করা এবং আনলক করা এবং সেই ক্রিয়াকলাপগুলি সুস্পষ্টভাবে গ্যারান্টিযুক্ত যে থ্রেড নিরাপদ এবং ডেটা রেসগুলি প্রবর্তন না করে। এই একই যুক্তি std::atomic<T>
বস্তুর ক্ষেত্রে প্রযোজ্য : এগুলি এটমিকভাবে স্থানান্তরিত না করা পারলে নিরাপদে তাদের সরানো সম্ভব হত না, অন্য কোনও থ্রেড কল করার চেষ্টা করছেcompare_exchange_strong
মুহুর্তে এটি সরানো হচ্ছে ঠিক মুহূর্তে। সুতরাং আর একটি ক্ষেত্রে যেখানে প্রকারগুলি চলনযোগ্য না হওয়া উচিত সেগুলি হল সেগুলি নিরাপদ সমবর্তী কোডের নিম্ন-স্তরের বিল্ডিং ব্লক এবং তাদের উপর সমস্ত ক্রিয়াকলাপের পারমাণবিকতা নিশ্চিত করতে হবে। যদি কোনও সময়ে বস্তুর মান কোনও নতুন অবজেক্টে স্থানান্তরিত হতে পারে তবে প্রতিটি পারমাণবিক পরিবর্তনশীলকে সুরক্ষিত করার জন্য আপনাকে যদি পারমাণবিক পরিবর্তনশীল ব্যবহার করতে হবে তবে আপনি জানতে পারবেন এটি ব্যবহার করা নিরাপদ কিনা বা স্থানান্তরিত হয়েছে কিনা ... এবং একটি পরমাণু পরিবর্তনশীল রক্ষা করতে যে পারমাণবিক পরিবর্তনশীল, এবং আরও ...
আমি মনে করি আমি সাধারণভাবে এটি বলতে চাই যে যখন কোনও বস্তু কেবল মেমরির খাঁটি অংশ হয় তবে এমন কোনও ধরণের নয় যা কোনও মান বা মূল্যকে বিমূর্ত করার জন্য ধারক হিসাবে কাজ করে, এটি স্থানান্তরিত করার কোনও মানে হয় না। মৌলিক ধরণের যেমন int
চলতে পারে না: এগুলি সরিয়ে নেওয়া কেবল একটি অনুলিপি। আপনি একটি থেকে সাহস ছিঁড়ে ফেলতে পারবেন না int
, আপনি এর মানটি অনুলিপি করতে পারেন এবং তারপরে এটি শূন্যতে সেট করতে পারেন, তবে এটি এখনও int
একটি মান সহ একটি, এটি কেবল মেমরির বাইট। তবে একটি int
এখনও অস্থাবরভাষার পদগুলিতে কারণ একটি অনুলিপি একটি বৈধ পদক্ষেপ অপারেশন। অনুলিপিযোগ্য প্রকারের জন্য, আপনি যদি না চান বা মেমরির অংশটি সরাতে না পারেন এবং আপনি এর মানটিও অনুলিপি করতে পারবেন না, তবে এটি অচল। একটি মিউটেক্স বা পারমাণবিক পরিবর্তনশীল মেমরির একটি নির্দিষ্ট অবস্থান (বিশেষ বৈশিষ্ট্যযুক্ত) এটি স্থানান্তরিত করার কোনও অর্থ দেয় না, এবং অনুলিপিযোগ্যও নয়, সুতরাং এটি অচল।