Hacker News

C++17 ৰ পৰা Std:Shared_mutex বুজা

মন্তব্য

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

C++17

ৰ পৰা std::shared_mutex বুজা হৈছে

std::shared_mutex, C++17 ত প্ৰৱৰ্তিত, এটা সমন্বয় প্ৰিমিটিভ যি একাধিক থ্ৰেডক একেলগে অংশীদাৰী (পঢ়া) লকসমূহ ধৰি ৰখাৰ অনুমতি দিয়ে আৰু লিখা কাৰ্য্যসমূহৰ বাবে একচেটিয়া অভিগম সুনিশ্চিত কৰে। ই আধুনিক C++ ত এটা সাধাৰণ সমকালীন প্ৰত্যাহ্বান সমাধান কৰে ডেভেলপাৰসকলক তৃতীয়-পক্ষ লাইব্ৰেৰী বা প্লেটফৰ্ম-নিৰ্দিষ্ট APIসমূহৰ বাবে হাত নোযোৱাকৈ পাঠক-ৰাইটাৰ লক প্ৰণয়ন কৰাৰ এটা পৰিষ্কাৰ, প্ৰামাণিক উপায় দি।

std::shared_mutex সঠিকভাৱে কি আৰু ইয়াক C++17 ত কিয় যোগ কৰা হৈছিল?

C++17 ৰ আগতে, পাঠক-ৰাইটাৰ অৰ্থবিজ্ঞানৰ প্ৰয়োজন হোৱা ডেভেলপাৰসকলে POSIX চিস্টেমসমূহত pthread_rwlock_t বা Windows ত SRWLOCK ৰ দৰে প্লেটফৰ্ম-নিৰ্দিষ্ট সমাধানসমূহৰ ওপৰত নিৰ্ভৰ কৰিবলগীয়া হৈছিল, নহ'লে তেওঁলোকে Boost ৰ দৰে তৃতীয়-পক্ষ লাইব্ৰেৰীসমূহ ব্যৱহাৰ কৰিব। C++17 প্ৰামাণিক সমিতিয়ে এই ব্যৱধান চিনাক্ত কৰিলে আৰু ইয়াক প্ৰত্যক্ষভাৱে সম্বোধন কৰিবলে হেডাৰত std::shared_mutex প্ৰৱৰ্তন কৰিলে।

মূল ধাৰণাটো পোনপটীয়া: বহুতো বাস্তৱ জগতৰ প্ৰগ্ৰেমত, তথ্য লিখাতকৈ বহু বেছি সঘনাই পঢ়া হয়। এটা প্ৰামাণিক std::mutex এ সকলো অভিগম ক্ৰমিক কৰে — পঢ়া অন্তৰ্ভুক্ত — যি অপ্ৰয়োজনীয় বটলনেক সৃষ্টি কৰে। std::shared_mutex এ দুটা লক ধৰণৰ মাজত পাৰ্থক্য কৰি সেই নিষেধাজ্ঞা উঠায়:

  • অংশীদাৰী (পঢ়া) লকlock_shared() ৰ যোগেদি অধিগ্ৰহণ কৰা হৈছে; একাধিক থ্ৰেডে ইয়াক একেলগে ধৰি ৰাখিব পাৰে, ইয়াক সমকালীন পঢ়াৰ বাবে আদৰ্শ কৰি তুলিছে।
  • একচেটিয়া (লিখা) লকlock() ৰ যোগেদি অধিগ্ৰহণ কৰা হৈছে; এটা সময়ত কেৱল এটা থ্ৰেডে ইয়াক ধৰি ৰাখিব পাৰে, আৰু ইয়াক ধৰি ৰখাৰ সময়ত কোনো অংশীদাৰী লক অনুমোদিত নহয়।
  • std::shared_lock — এটা RAII ৰেপাৰ যি নিৰ্মাণৰ সময়ত lock_shared() আৰু ধ্বংসৰ সময়ত unlock_shared() কল কৰে, সম্পদ লিক প্ৰতিৰোধ কৰে।
  • std::unique_lock / std::lock_guard — একচেটিয়া ধৰণৰ সৈতে ব্যৱহাৰ কৰা হয়, লিখা কাৰ্য্যসমূহ সম্পূৰ্ণৰূপে সুৰক্ষিত আৰু ব্যতিক্ৰম-নিৰাপদ হোৱাটো নিশ্চিত কৰা।

এই দ্বৈত-ম'ড ডিজাইনে std::shared_mutex ক কেশ্ব, বিন্যাস পঞ্জিকা, আৰু যিকোনো তথ্য গঠনৰ দৰে পৰিস্থিতিৰ বাবে এটা স্বাভাৱিক ফিট কৰে য'ত পঢ়াই কাৰ্য্যভাৰত আধিপত্য বিস্তাৰ কৰে।

আপুনি মন্তব্যৰ সৈতে বাস্তৱ ক'ডত std::shared_mutex কেনেকৈ ব্যৱহাৰ কৰে?

std::shared_mutex ব্যৱহাৰ কৰা ক'ডত মন্তব্যসমূহ বিশেষভাৱে মূল্যৱান কাৰণ সমকালীন যুক্তিৰ বিষয়ে যুক্তি দিয়াটো কুখ্যাতভাৱে কঠিন। ভালদৰে স্থাপন কৰা মন্তব্যই স্পষ্ট কৰে যে কিয় এটা বিশেষ লক ধৰণ বাছি লোৱা হৈছিল, যিয়ে ভৱিষ্যতৰ ৰক্ষণাবেক্ষণকাৰীসকলে ভুলবশতঃ ডাটা ৰেচ প্ৰৱৰ্তন কৰাৰ আশংকা নাটকীয়ভাৱে হ্ৰাস কৰে। ইয়াত এটা সাধাৰণ আৰ্হি দিয়া হৈছে:

# অন্তৰ্ভুক্ত কৰক
#unordered_map> অন্তৰ্ভুক্ত কৰক
# অন্তৰ্ভুক্ত কৰক

class বিন্যাস পঞ্জীয়ন {
    পৰিৱৰ্তনশীল std::shared_mutex mtx_; // তলৰ মেপটোক সুৰক্ষিত কৰে
    std::অক্ৰমিত_মেপ ডাটা_;

ৰাজহুৱা:
    // পঢ়া পথ: একাধিক থ্ৰেডে ইয়াক একেলগে কল কৰিব পাৰে
    std::string get(const std::স্ট্ৰিং& চাবি) const {
        std::শ্বেয়াৰড_লক লক(mtx_); // অংশীদাৰী লক — সমকালীন পঢ়াৰ বাবে সুৰক্ষিত
        অটো ই = ডাটা_.বিচাৰ(কী);
        ইয়াক ঘূৰাই দিয়ক != data_.end() ? it->second : "";
    }

    // লিখাৰ পথ: একচেটিয়া অভিগমৰ প্ৰয়োজন
    void set(const std::স্ট্ৰিং& কি, const std::স্ট্ৰিং& val) {
        std::অনন্য_লক লক (mtx_); // একচেটিয়া লক — সকলো পাঠকক ব্লক কৰে
        ডাটা_[কী] = val;
    }
};

মন্য কৰক যে মন্তব্যসমূহে প্ৰতিটো লক পছন্দৰ আঁৰৰ উদ্দেশ্য কেনেকৈ ব্যাখ্যা কৰে কেৱল ক'ডে কি কৰে পুনৰ কোৱাতকৈ। এইটোৱেই হৈছে সোণৰ মানদণ্ড: মন্তব্যই কিয়ৰ উত্তৰ দিব লাগে, কি নহয়। মিউটেক্সত mutable চাবিশব্দে get()const ঘোষণা কৰাৰ অনুমতি দিয়ে আৰু এতিয়াও লক কৰিব পৰাকৈ, এটা সাধাৰণ আৰু প্ৰবচনমূলক আৰ্হি।

<ব্লককোট>

কী অন্তৰ্দৃষ্টি: সদায় std::shared_mutex ৰ সৈতে RAII লক ৰেপাৰসমূহ (std::shared_lock, std::unique_lock) ব্যৱহাৰ কৰক — lock() আৰু unlock()ক কেতিয়াও হস্তচালিতভাৱে কল নকৰিব। ব্যতিক্ৰমৰ উপস্থিতিত হস্তচালিত লক কৰাটো ডেডলক আৰু অসংজ্ঞায়িত আচৰণৰ এটা নিশ্চিত পথ।

ৰ দ্বাৰা

std::shared_mutex ৰ সৈতে কাম কৰাৰ সময়ত সাধাৰণ ফান্দসমূহ কি কি?

স্পষ্ট মন্তব্য আৰু ভাল উদ্দেশ্যৰ সৈতেও, std::shared_mutex ৰ সূক্ষ্ম ফান্দ আছে যিয়ে অভিজ্ঞ বিকাশকসকলক ট্ৰিপ আপ কৰে। আটাইতকৈ বিপজ্জনক হৈছে লক উন্নয়ন: এটা অংশীদাৰী লকক প্ৰথমে মুকলি নকৰাকৈ এটা একচেটিয়া লকলৈ উন্নয়ন কৰাৰ কোনো অন্তৰ্নিৰ্মিত উপায় নাই। মুকলি নকৰাকৈ তেনে কৰিবলৈ চেষ্টা কৰিলে এটা তৎক্ষণাত ডেডলক সৃষ্টি হয় কাৰণ থ্ৰেডে এটা অংশীদাৰী লক ধৰি ৰাখে যেতিয়ালৈকে কোনো অংশীদাৰী লক আছে তেতিয়ালৈকে কেতিয়াও প্ৰদান কৰিব নোৱাৰি — ই ধৰি ৰখাটোকে ধৰি।

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

আন এটা সাধাৰণ ভুল হ'ল ভুল গ্ৰেনুলেৰিটি সুৰক্ষিত কৰা। ডেভেলপাৰসকলে কেতিয়াবা অতি বহলভাৱে লক কৰে, পাঠক-লেখক আৰ্হিৰ উদ্দেশ্যক পৰাস্ত কৰে, বা অতি সংকীৰ্ণভাৱে, উইণ্ড'সমূহ এৰি দিয়ে য'ত দুটা পৃথক লক অধিগ্ৰহণৰ মাজত অপৰিৱৰ্তনীয়সমূহ উলংঘা কৰা হয়। কেৱল লক কৰা চলকটোৰ পৰিৱৰ্তে, অপৰিৱৰ্তনীয়ক সুৰক্ষিত কৰাৰ বৰ্ণনা কৰা মন্তব্যসমূহে দলসমূহক ক'ড পৰ্যালোচনাৰ সময়ত শুদ্ধতাৰ বিষয়ে যুক্তি দিবলৈ সহায় কৰে।

পাৰফৰমেন্সেও আপোনাক আচৰিত কৰিব পাৰে। বহু লেখকৰ সৈতে অতি প্ৰতিদ্বন্দ্বিতামূলক ব্যৱস্থাপ্ৰণালীত, std::shared_mutex এ প্ৰকৃততে এটা সাধাৰণ std::mutexতকৈ বেয়া কাম কৰিব পাৰে অতিৰিক্ত বহী ৰখাৰ ওভাৰহেডৰ বাবে। পাঠক-লেখক লক কৰাটো এটা নেট জয় বুলি ধৰি লোৱাৰ আগতে সদায় প্ৰফাইল কৰক।

std::shared_mutex std::mutex আৰু অন্য বিকল্পসমূহৰ সৈতে কেনেকৈ তুলনা কৰা হয়?

std::mutex সৰল, বিবাদ কম হ'লে লাভ কৰিবলৈ দ্ৰুত, আৰু পঢ়া আৰু লিখা প্ৰায় সমান কম্পাঙ্কত হ'লে উপযুক্ত। std::shared_mutex জিলিকি উঠে যেতিয়া পঢ়াৰ সংখ্যাই লিখাতকৈ যথেষ্ট বেছি — চুইচ বিবেচনা কৰাৰ আগতে এটা 10:1 বা তাতকৈ অধিক অনুপাত এটা যুক্তিসংগত নিয়ম।

C++14 এ std::shared_timed_mutex প্ৰৱৰ্তন কৰে, যি সময় নিৰ্ধাৰিত প্ৰচেষ্টাৰ বাবে try_lock_shared_for() আৰু try_lock_shared_until() যোগ কৰে। C++17 ৰ std::shared_mutex এ এটা ক্ষীণ প্ৰণয়নৰ বাবে সময় নিৰ্ধাৰণ কৰা ভিন্নতাসমূহ বাদ দিয়ে। যদি আপুনি অংশীদাৰী পথত সময় নিৰ্ধাৰণ কৰা লক কৰাৰ প্ৰয়োজন হয়, std::shared_timed_mutex উপলব্ধ হৈ থাকে আৰু দুয়োটা ধৰণ সম্পূৰ্ণৰূপে প্ৰামাণিক।

লক-মুক্ত বিকল্পসমূহৰ বাবে, সাৱধানে মেমৰি ক্ৰমৰ সৈতে সংযুক্ত std::atomic কেতিয়াবা সৰল ফ্লেগ বা কাউণ্টাৰসমূহৰ বাবে এটা মিউটেক্স সম্পূৰ্ণৰূপে সলনি কৰিব পাৰে, কিন্তু জটিল তথ্য গঠনসমূহৰ বাবে, std::shared_mutex প্ৰামাণিক লাইব্ৰেৰীত আটাইতকৈ পঢ়িব পৰা আৰু ৰক্ষণাবেক্ষণযোগ্য সমাধান হৈয়েই থাকে।

সঘনাই সোধা প্ৰশ্ন

std::shared_mutex এ অনাহাৰৰ সৃষ্টি কৰিব পাৰেনে?

হয়, পাৰে। যদি নতুন অংশীদাৰী-লক ধাৰীসকল অবিৰতভাৱে আহি থাকে, এটা একচেটিয়া-লক অনুৰোধকাৰীয়ে অনিৰ্দিষ্টকাললৈ অপেক্ষা কৰিব পাৰে — এটা ক্লাছিক লেখকৰ অনাহাৰ সমস্যা। C++ প্ৰামাণিক এটা নিৰ্দিষ্ট ন্যায্যতা নীতি নিৰ্দেশ নিদিয়ে, গতিকে আচৰণ প্ৰণয়নৰ ওপৰত নিৰ্ভৰ কৰে। কাৰ্য্যত, বেছিভাগ প্ৰামাণিক লাইব্ৰেৰী প্ৰণয়নে এবাৰ শাৰীত ৰখাৰ পিছত বাকী থকা একচেটিয়া লকসমূহক অগ্ৰাধিকাৰ দিয়ে, কিন্তু আপুনি ইয়াক আপোনাৰ নিৰ্দিষ্ট সঁজুলিশৃংখল আৰু প্লেটফৰ্মৰ বাবে পৰীক্ষা কৰিব লাগে যদি উৎপাদনত অনাহাৰে এটা চিন্তাৰ বিষয়।

std::shared_mutex std::condition_variable ৰ সৈতে ব্যৱহাৰ কৰাটো নিৰাপদ নেকি?

std::condition_variable ৰ বাবে এটা std::unique_lock ৰ প্ৰয়োজন, গতিকে ই std::shared_mutex ৰ সৈতে প্ৰত্যক্ষভাৱে সুসংগত নহয়। যদি আপুনি এটা অংশীদাৰী মিউটেক্স ধৰি থকাৰ সময়ত এটা চৰ্তত অপেক্ষা কৰিব লাগে, std::condition_variable_any ব্যৱহাৰ কৰক, যি যিকোনো BasicLockable ধৰণৰ সৈতে কাম কৰে, std::shared_mutex এটা std::shared_lock.

ৰ সৈতে যোৰ কৰা অন্তৰ্ভুক্ত কৰি

মই প্ৰতিবাৰ std::shared_mutex ব্যৱহাৰ কৰাৰ সময়ত মন্তব্য যোগ কৰিব লাগেনে?

নূন্যতম, ই কি তথ্য সুৰক্ষিত কৰে আৰু ই ৰক্ষণাবেক্ষণ কৰা অপৰিৱৰ্তনীয়সমূহ বৰ্ণনা কৰিবলৈ মিউটেক্সৰ ঘোষণাক মন্তব্য কৰক। প্ৰতিটো লক চাইটত, অংশীদাৰী বনাম একচেটিয়া অভিগম কিয় বাছনি কৰা হৈছিল সেই বিষয়ে ব্যাখ্যা কৰা এটা চমু মন্তব্যই ক'ড পৰ্যালোচক আৰু ভৱিষ্যত ৰক্ষণাবেক্ষণকাৰীৰ বাবে উল্লেখযোগ্য মূল্য যোগ কৰে। সমকালীন বাগসমূহ পুনৰুত্পাদন আৰু সমাধান কৰা আটাইতকৈ কঠিনসমূহৰ ভিতৰত অন্যতম, গতিকে স্পষ্ট, নিখুঁত মন্তব্যত বিনিয়োগে বহুগুণে বেছি লভ্যাংশ দিয়ে।


জটিল ব্যৱস্থাপ্ৰণালী পৰিচালনা কৰা — সমকালীন C++ ক'ড হওক বা এটা সম্পূৰ্ণ ব্যৱসায়িক কাৰ্য্যই হওক — সঠিক সঁজুলি আৰু স্পষ্ট গঠনৰ প্ৰয়োজন। Mewayz হৈছে ২০৭-মডিউল ব্যৱসায়িক অপাৰেটিং ছিষ্টেম যিটো ১৩৮,০০০ তকৈ অধিক ব্যৱহাৰকাৰীয়ে বিশ্বাস কৰে যাতে বিপণন, চি আৰ এম, ই-কমাৰ্চ, বিশ্লেষণ, আৰু অধিকলৈ সেই একে স্পষ্টতা আনিব পাৰে, এই সকলোবোৰ এটা প্লেটফৰ্মত প্ৰতিমাহে মাত্ৰ ১৯ ডলাৰৰ পৰা আৰম্ভ হয়। ডজন ডজন বিচ্ছিন্ন সঁজুলিৰ জগলিং বন্ধ কৰক আৰু আপোনাৰ ব্যৱসায়টো সু-ডিজাইন কৰা চফ্টৱেৰৰ নিখুঁততাৰে চলাবলৈ আৰম্ভ কৰক। আজি app.mewayz.com ত Mewayz চেষ্টা কৰক আৰু চাওক যে এটা ঐক্যবদ্ধ ব্যৱস্থাই আপোনাৰ দলৰ কাম কৰাৰ ধৰণ কেনেকৈ ৰূপান্তৰিত কৰে।

লভ্যাংশ দিয়ে

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime