সি ++ 17 একটি নতুন লক ক্লাস নামে পরিচিত std::scoped_lock
।
ডকুমেন্টেশন থেকে বিচার করা এটি ইতিমধ্যে বিদ্যমান std::lock_guard
শ্রেণীর অনুরূপ ।
পার্থক্য কী এবং আমি কখন এটি ব্যবহার করব?
সি ++ 17 একটি নতুন লক ক্লাস নামে পরিচিত std::scoped_lock
।
ডকুমেন্টেশন থেকে বিচার করা এটি ইতিমধ্যে বিদ্যমান std::lock_guard
শ্রেণীর অনুরূপ ।
পার্থক্য কী এবং আমি কখন এটি ব্যবহার করব?
উত্তর:
এটি scoped_lock
হ'ল একটি কঠোরতর সংস্করণ lock_guard
যা একসাথে একসাথে সংখ্যক মুটেক্সকে তালা দেয় (একই অচলতা-এড়ানো এ্যালগরিদম হিসাবে ব্যবহার করে std::lock
)। নতুন কোডে আপনার কেবল কখনও ব্যবহার করা উচিত scoped_lock
।
lock_guard
উপযুক্ততার জন্য এখনও এখনও বিদ্যমান কারণ । এটি কেবল মোছা যায়নি, কারণ এটি বর্তমান কোডে ব্যবহৃত হয়। তদুপরি, এটির সংজ্ঞাটি পরিবর্তনের জন্য অবাঞ্ছিত প্রমাণিত হয়েছিল (অকার্যকর থেকে বৈকল্পিকতে), কারণ এটিও একটি পর্যবেক্ষণযোগ্য, এবং তাই ভঙ্গ, পরিবর্তন (তবে কিছু প্রযুক্তিগত কারণে)।
lock_guard
। তবে এটি অবশ্যই গার্ড ক্লাসগুলি ব্যবহার করতে কিছুটা সহজ করে তোলে।
একক এবং গুরুত্বপূর্ণ পার্থক্যটি হ'ল std::scoped_lock
একটি বৈকল্পিক নির্মাতা একাধিক মুটেক্স গ্রহণ করছেন। এটি কোনও মডিটলকে এড়ানোর উপায়ে যেমন std::lock
ব্যবহার করা হয়েছিল তেমন লক করতে দেয় ।
{
// safely locked as if using std::lock
std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);
}
পূর্বে এই উত্তরটিstd::lock
ব্যাখ্যা করে আপনি নিরাপদে উপায়ে একাধিক মুটেক্সকে লক করতে কিছুটা নাচ করতে হয়েছিল ।
স্কোপ লকের সংযোজন এটি ব্যবহার করা সহজ করে এবং সম্পর্কিত ত্রুটিগুলি এড়িয়ে চলে। আপনি std::lock_guard
অবহেলিত বিবেচনা করতে পারেন । এর একক যুক্তি কেস std::scoped_lock
বিশেষায়িতকরণ হিসাবে প্রয়োগ করা যেতে পারে এবং আপনার সম্ভাব্য পারফরম্যান্স সংক্রান্ত সমস্যাগুলির বিষয়ে ভয় করতে হবে না।
জিসিসি 7 এর ইতিমধ্যে সমর্থন রয়েছে std::scoped_lock
যার জন্য এখানে দেখা যায় ।
আরও তথ্যের জন্য আপনি স্ট্যান্ডার্ড পেপারটি পড়তে চাইতে পারেন
scoped_lock lk; // locks all mutexes in scope
। LGTM।
scoped_lock lk;
জন্য নতুন শর্টহ্যান্ড scoped_lock<> lk;
। সেখানে হয় কোন mutexes। সুতরাং আপনি ঠিক বলেছেন। ;-)
দেরীতে উত্তর, এবং বেশিরভাগ জবাব:
আপনি
std::lock_guard
অবহেলিত বিবেচনা করতে পারেন ।
সাধারণ ক্ষেত্রে যেটির জন্য একটিকে অবশ্যই একটি মিউটেক্স লক করা দরকার, std::lock_guard
এর একটি এপিআই রয়েছে যা ব্যবহার করা একটু নিরাপদ scoped_lock
।
উদাহরণ স্বরূপ:
{
std::scoped_lock lock; // protect this block
...
}
উপরের স্নিপেট সম্ভবত একটি দুর্ঘটনাজনক রান-টাইম ত্রুটি কারণ এটি সংকলন করে এবং তারপরে একেবারে কিছুই করে না। কোডার সম্ভবত সম্ভবত:
{
std::scoped_lock lock{mut}; // protect this block
...
}
এখন এটি লক / আনলক করে mut
।
যদি lock_guard
পরিবর্তে উপরের দুটি উদাহরণে ব্যবহার করা হয়, প্রথম উদাহরণটি একটি রান-টাইম ত্রুটির পরিবর্তে একটি সংকলন-সময় ত্রুটি এবং দ্বিতীয় উদাহরণটিতে ব্যবহৃত সংস্করণ হিসাবে অভিন্ন কার্যকারিতা রয়েছে scoped_lock
।
সুতরাং আমার পরামর্শটি হল কাজের সহজ সরল সরঞ্জামটি ব্যবহার করার জন্য:
lock_guard
আপনার যদি পুরো স্কোপের জন্য ঠিক 1 টি মিউটেক্স লক করা দরকার।
scoped_lock
আপনার যদি এমন একাধিক মুটেক্সকে লক করতে হয় যা হুবহু 1 নয়।
unique_lock
আপনার যদি ব্লকের পরিধিগুলির মধ্যে আনলক করা দরকার (যার সাথে ক ব্যবহার অন্তর্ভুক্ত condition_variable
)।
এই পরামর্শটি বোঝায় না যে scoped_lock
0 টি মুটেক্সগুলি গ্রহণ না করার জন্য নতুনভাবে নকশা করা উচিত। বৈধ ব্যবহারের কেস রয়েছে যেখানে scoped_lock
ভ্যারিয়েডিক টেম্পলেট প্যারামিটার প্যাকগুলি গ্রহণ করা বাঞ্ছনীয় যা খালি থাকতে পারে। এবং খালি ক্ষেত্রে কিছু লক করা উচিত নয় ।
এবং এজন্যই lock_guard
হতাশ নয়। scoped_lock
এবং unique_lock
এর কার্যকারিতা একটি সুপারস্টেট হতে পারে lock_guard
, কিন্তু এই সত্যটি একটি দ্বি-তরোয়াল তরোয়াল। কখনও কখনও এটি গুরুত্বপূর্ণ যেমন কোনও প্রকারটি কী করবে না (ডিফল্ট ক্ষেত্রে এই ক্ষেত্রে কন্সট্রাক্ট)।
ক্রিয়াকলাপে সি ++ কনক্যুরঞ্জির একটি নমুনা এবং উদ্ধৃতি এখানে :
friend void swap(X& lhs, X& rhs)
{
if (&lhs == & rhs)
return;
std::lock(lhs.m, rhs.m);
std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock);
std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock);
swap(lhs.some_detail, rhs.some_detail);
}
বনাম
friend void swap(X& lhs, X& rhs)
{
if (&lhs == &rhs)
return;
std::scoped_lock guard(lhs.m, rhs.m);
swap(lhs.some_detail, rhs.some_detail);
}
অস্তিত্বের
std::scoped_lock
অর্থ হ'লstd::lock
আপনি সি ++ 17 এর আগে ব্যবহার করতেন এমন বেশিরভাগ ক্ষেত্রেই এখনstd::scoped_lock
ভুলগুলির কম সম্ভাবনা রয়েছে যা ব্যবহার করে লেখা যেতে পারে , যা কেবলমাত্র ভাল জিনিস হতে পারে!