C ++ 14 মনে হচ্ছে কোনও std::mutex
লক হয়েছে কিনা তা যাচাই করার জন্য একটি প্রক্রিয়া বাদ দিয়েছে । এই তাই প্রশ্ন দেখুন:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
এর চারপাশে বেশ কয়েকটি উপায় রয়েছে, যেমন ব্যবহার করে;
std::mutex::try_lock()
std::unique_lock::owns_lock()
তবে এগুলির কোনওটিই বিশেষ সন্তোষজনক সমাধান নয়।
try_lock()
একটি মিথ্যা নেতিবাচক ফেরত দেওয়ার অনুমতি দেওয়া হয়েছে এবং বর্তমান থ্রেডটি মিউটেক্সকে লক করে রাখলে তার অপরিবর্তিত আচরণ রয়েছে। এর পার্শ্ব-প্রতিক্রিয়াও রয়েছে। মূলটির উপরে owns_lock()
একটি নির্মাণ প্রয়োজন ।unique_lock
std::mutex
স্পষ্টতই আমি আমার নিজস্ব রোল করতে পারি, তবে আমি বরং বর্তমান ইন্টারফেসের প্রেরণাগুলি বুঝতে পারি।
মিউটেক্সের অবস্থান পরীক্ষা করার ক্ষমতা (যেমন std::mutex::is_locked()
) আমার কাছে কোনও রহস্যজনক অনুরোধ বলে মনে হয় না, তাই আমি সন্দেহ করি যে স্ট্যান্ডার্ড কমিটি পর্যবেক্ষণ হওয়ার চেয়ে এই বৈশিষ্ট্যটি ইচ্ছাকৃতভাবে বাদ দিয়েছে।
কেন?
সম্পাদনা: ঠিক আছে তাই সম্ভবত এই ব্যবহারের ক্ষেত্রে আমার প্রত্যাশার মতো সাধারণ পরিস্থিতি নেই, তাই আমি আমার নির্দিষ্ট দৃশ্যের চিত্র তুলে ধরব। আমার কাছে একটি মেশিন লার্নিং অ্যালগরিদম রয়েছে যা একাধিক থ্রেডে বিতরণ করা হয়। প্রতিটি থ্রেড অবিচ্ছিন্নভাবে পরিচালনা করে এবং একটি অনুকূলকরণের সমস্যাটি শেষ হয়ে গেলে একটি মাস্টার পুলে ফিরে আসে।
এটি তখন একটি মাস্টার মিটেক্স লক করে ks থ্রেডটি অবশ্যই একটি নতুন পিতামাতাকে বেছে নিতে হবে যা থেকে কোনও সন্তানের রূপান্তর করতে পারে তবে কেবলমাত্র এমন পিতামাতাদের কাছ থেকে বেছে নিতে পারে যা বর্তমানে বংশধর নয় যা অন্যান্য থ্রেড দ্বারা অনুকূলিত করা হচ্ছে। অতএব, এমন পিতামাতাদের সন্ধানের জন্য আমার অনুসন্ধান করা দরকার যা বর্তমানে অন্য থ্রেড দ্বারা লক করা হয়নি। মাস্টার থ্রেড মিটেক্স লক থাকায় অনুসন্ধানের সময় মিউটেক্সের স্থিতির কোনও ঝুঁকি নেই। স্পষ্টতই অন্যান্য সমাধান রয়েছে (আমি বর্তমানে বুলিয়ান পতাকা ব্যবহার করছি) তবে আমি ভেবেছিলাম যে মুটেক্স এই সমস্যাটির একটি যৌক্তিক সমাধান সরবরাহ করে, কারণ এটি আন্ত-থ্রেড সিঙ্ক্রোনাইজেশনের উদ্দেশ্যে বিদ্যমান।
is_locked
?