এসটিডি :: লক_গার্ড বা এসটিডি :: স্কোপড_লক?


143

সি ++ 17 একটি নতুন লক ক্লাস নামে পরিচিত std::scoped_lock

ডকুমেন্টেশন থেকে বিচার করা এটি ইতিমধ্যে বিদ্যমান std::lock_guardশ্রেণীর অনুরূপ ।

পার্থক্য কী এবং আমি কখন এটি ব্যবহার করব?

উত্তর:


125

এটি scoped_lockহ'ল একটি কঠোরতর সংস্করণ lock_guardযা একসাথে একসাথে সংখ্যক মুটেক্সকে তালা দেয় (একই অচলতা-এড়ানো এ্যালগরিদম হিসাবে ব্যবহার করে std::lock)। নতুন কোডে আপনার কেবল কখনও ব্যবহার করা উচিত scoped_lock

lock_guardউপযুক্ততার জন্য এখনও এখনও বিদ্যমান কারণ । এটি কেবল মোছা যায়নি, কারণ এটি বর্তমান কোডে ব্যবহৃত হয়। তদুপরি, এটির সংজ্ঞাটি পরিবর্তনের জন্য অবাঞ্ছিত প্রমাণিত হয়েছিল (অকার্যকর থেকে বৈকল্পিকতে), কারণ এটিও একটি পর্যবেক্ষণযোগ্য, এবং তাই ভঙ্গ, পরিবর্তন (তবে কিছু প্রযুক্তিগত কারণে)।


8
এছাড়াও, শ্রেণি টেম্পলেট যুক্তি ছাড়ের জন্য ধন্যবাদ, আপনাকে এমনকি তালাবন্ধযোগ্য ধরণের তালিকা তৈরি করতে হবে না।
নিকল বোলাস

3
@ নিকোলবোলাস: এটি সত্য, তবে এটি প্রযোজ্যও lock_guard। তবে এটি অবশ্যই গার্ড ক্লাসগুলি ব্যবহার করতে কিছুটা সহজ করে তোলে।
কেরেক এসবি

6
স্কোপড_লকটি কেবল সি ++ 17 হয়
শীতল শাহ

1
এটি যেমন সি ++ 17, সামঞ্জস্যতা এটির অস্তিত্বের একটি বিশেষত ভাল কারণ। এই মানটি থেকে কালিটি শুকনো থাকাকালীন "আপনার কেবলমাত্র ব্যবহার করা উচিত" এর কোনও নিরঙ্কুশ দাবির সাথে আমি দৃhe়ভাবে একমত নই।
পল চাইল্ডস

88

একক এবং গুরুত্বপূর্ণ পার্থক্যটি হ'ল 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যার জন্য এখানে দেখা যায় ।

আরও তথ্যের জন্য আপনি স্ট্যান্ডার্ড পেপারটি পড়তে চাইতে পারেন


9
মাত্র 10 মিনিটের পরে আপনার নিজের প্রশ্নের উত্তর দিয়েছেন। আপনি কি সত্যিই জানেন না?
ওয়াল্টার


3
আমি যখন এটি কমিটিতে আনি, তখন উত্তরটি "কিছুই ছিল না"। এটি হতে পারে যে কিছু অ্যালগোরিদমের অধঃপতনের ক্ষেত্রে এটি ঠিক সঠিক জিনিস। অথবা এটি হতে পারে যে পর্যাপ্ত লোকেরা দুর্ঘটনাক্রমে কোনও কিছুই লক করে না যখন তারা কোনও কিছু লক করার উদ্দেশ্যে নিয়ে আসে তখন একটি সাধারণ সমস্যা। আমি সত্যিই নিশ্চিত নই।
হাওয়ার্ড হিনান্ট

3
@HowardHinnant: scoped_lock lk; // locks all mutexes in scope। LGTM।
কেরেক এসবি

2
@ কেরেকএসবি: এটির scoped_lock lk;জন্য নতুন শর্টহ্যান্ড scoped_lock<> lk;। সেখানে হয় কোন mutexes। সুতরাং আপনি ঠিক বলেছেন। ;-)
হাওয়ার্ড হিনান্ট

26

দেরীতে উত্তর, এবং বেশিরভাগ জবাব:

আপনি 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

সুতরাং আমার পরামর্শটি হল কাজের সহজ সরল সরঞ্জামটি ব্যবহার করার জন্য:

  1. lock_guard আপনার যদি পুরো স্কোপের জন্য ঠিক 1 টি মিউটেক্স লক করা দরকার।

  2. scoped_lock আপনার যদি এমন একাধিক মুটেক্সকে লক করতে হয় যা হুবহু 1 নয়।

  3. unique_lockআপনার যদি ব্লকের পরিধিগুলির মধ্যে আনলক করা দরকার (যার সাথে ক ব্যবহার অন্তর্ভুক্ত condition_variable)।

এই পরামর্শটি বোঝায় না যে scoped_lock0 টি মুটেক্সগুলি গ্রহণ না করার জন্য নতুনভাবে নকশা করা উচিত। বৈধ ব্যবহারের কেস রয়েছে যেখানে scoped_lockভ্যারিয়েডিক টেম্পলেট প্যারামিটার প্যাকগুলি গ্রহণ করা বাঞ্ছনীয় যা খালি থাকতে পারে। এবং খালি ক্ষেত্রে কিছু লক করা উচিত নয়

এবং এজন্যই lock_guardহতাশ নয়। scoped_lock এবং unique_lock এর কার্যকারিতা একটি সুপারস্টেট হতে পারে lock_guard, কিন্তু এই সত্যটি একটি দ্বি-তরোয়াল তরোয়াল। কখনও কখনও এটি গুরুত্বপূর্ণ যেমন কোনও প্রকারটি কী করবে না (ডিফল্ট ক্ষেত্রে এই ক্ষেত্রে কন্সট্রাক্ট)।


13

ক্রিয়াকলাপে সি ++ কনক্যুরঞ্জির একটি নমুনা এবং উদ্ধৃতি এখানে :

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ভুলগুলির কম সম্ভাবনা রয়েছে যা ব্যবহার করে লেখা যেতে পারে , যা কেবলমাত্র ভাল জিনিস হতে পারে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.