Hacker News

د Std:Shared_mutex د C++17 څخه درک کول

تبصرې

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

د C++17 څخه std::shared_mutex پوهیدل

std::shared_mutex، چې په C++17 کې معرفي شوی، د همغږي کولو لومړنی دی چې ډیری تارونو ته اجازه ورکوي چې په یو وخت کې شریک شوي (لوستل) لاکونه وساتي پداسې حال کې چې د لیکلو عملیاتو لپاره ځانګړي لاسرسی ډاډمن کوي. دا په عصري C++ کې یو له خورا عام همغږي ننګونو څخه حل کوي ترڅو پراختیا کونکو ته د دریمې ډلې کتابتونونو یا پلیټ فارم ځانګړي APIs ته رسیدو پرته د لوستونکي-لیکونکي لاک کولو پلي کولو لپاره پاکه ، معیاري لاره ورکړي.

په حقیقت کې std::shared_mutex څه شی دی او ولې په C++17 کې اضافه شوی؟

د C++17 څخه مخکې، هغه پراختیا کونکي چې د لوستونکي لیکوال سیمانټیکونو ته اړتیا لري باید د پلیټ فارم ځانګړي حلونو لکه pthread_rwlock_t په POSIX سیسټمونو یا SRWLOCK په وینډوز کې تکیه وکړي، یا دوی به د دریمې ډلې کتابتونونه لکه بوسټ کاروي. د C++17 معیاري کمیټې دا تشه پیژني او په مستقیم ډول یې د حل کولو لپاره په سرلیک کې std::shared_mutex معرفي کړ.

اصلي مفکوره مستقیمه ده: په ډیری ریښتینې نړۍ پروګرامونو کې، ډاټا د لیکلو په پرتله ډیر ځله لوستل کیږي. یو معیاري std::mutex ټول لاسرسی سریالیز کوي - لوستل پکې شامل دي - کوم چې غیر ضروري خنډونه رامینځته کوي. std::shared_mutex د دوو تالاشۍ حالتونو ترمنځ توپیر کولو سره دا محدودیت لرې کوي:

  • شریک شوی (لوستل) لاک — د lock_shared() له لارې ترلاسه شوی؛ ډیری تارونه کولی شي دا په یو وخت کې وساتي، دا د یوځل لوستلو لپاره غوره کوي.
  • ځانګړی (لیکل) تالا — د lock() له لارې ترلاسه شوی؛ یوازې یو تار کولی شي دا په یو وخت کې وساتي، او د شریک شوي تالاشۍ اجازه نشته کله چې دا ساتل کیږي.
  • std::shared_lock — د RAII ریپر چې په ساختمان کې lock_shared() او په ویجاړولو کې unlock_shared() غږ کوي، د سرچینو لیک مخه نیسي.

دا دوه اړخیزه ډیزاین std::shared_mutex د سناریوګانو لکه کیچونو، ترتیب ثبتولو، او هر ډول ډیټا جوړښت لپاره طبیعي مناسب جوړوي چیرې چې لوستل د کار بار باندې غالب وي.

تاسو د تبصرو سره په ریښتیني کوډ کې std::shared_mutex څنګه کاروئ؟

په کوډ کې تبصرې چې std::shared_mutex کاروي په ځانګړې توګه ارزښتناکه دي ځکه چې د همغږۍ منطق په اړه د دلیل لپاره خورا سخت دی. ښه ځای پر ځای شوي نظرونه روښانه کوي چې ولې یو ځانګړی لاک ډول غوره شوی، کوم چې په ډراماتیک ډول د راتلونکي ساتونکو خطر کموي چې په ناڅاپي ډول د ډیټا ریسونو معرفي کوي. دلته یو عادي نمونه ده:

code>#شامل 
# شامل کړئ <بې ترتیبه_نقشه>
# شامل کړئ 

ټولګي ConfigRegistry {
    د بدلون وړ std::shared_mutex mtx_; // لاندې نقشه خوندي کوي
    std::unordered_map data_;

عامه:
    // د لوستلو لاره: ډیری تارونه کولی شي په ورته وخت کې غږ وکړي
    std::string get(const std::string & key) const {
        std::shared_lock lock(mtx_); // شریک تالا - د همغږي لوستلو لپاره خوندي
        auto it = data_.find(key);
        دا بیرته راګرځي!= data_.end()؟ it->دوهم : ""؛
    }

    // لاره ولیکئ: ځانګړي لاسرسي ته اړتیا ده
    باطل سیټ(const std::string& key, const std::string&val) {
        std::unique_lock lock(mtx_); // ځانګړی تالا - ټول لوستونکي بندوي
        data__[key] = val;
    }
}؛

وګورئ چې تبصرې څنګه د هر بند انتخاب تر شا اراده تشریح کوي د دې پرځای چې کوډ څه کوي. دا د سرو زرو معیار دی: تبصرې باید ځواب ورکړي ولې، نه څه. په mutex کې د متغیر کلیدي کلمه get() ته اجازه ورکوي چې اعلان شي const پداسې حال کې چې لاهم د لاک کولو توان لري، یو عام او محاوري نمونه.

کلیدي بصیرت: تل د RAII لاک ریپرونه (std::shared_lock, std::unique_lock) د std::shared_mutex سره وکاروئ — هیڅکله د 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's std::shared_mutex د لینر پلي کولو لپاره د وخت ټاکل شوي ډولونه کموي. که تاسو په شریکه لاره کې د وخت بندولو ته اړتیا لرئ، std::shared_timed_mutex شتون لري او دواړه ډولونه په بشپړ ډول معیاري دي.

د تالاشۍ څخه پاک بدیلونو لپاره، std::اتومیک د محتاط حافظې ترتیب سره یوځای کولی شي ځینې وختونه د ساده بیرغونو یا کاونټرونو لپاره په بشپړ ډول یو میوټیک بدل کړي ، مګر د پیچلو ډیټا جوړښتونو لپاره ، 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 د 207 ماډل سوداګریز OS دی چې د 138,000 څخه زیاتو کاروونکو لخوا باور لري ترڅو د بازار موندنې، CRM، ای کامرس، تحلیلاتو، او نورو لپاره ورته وضاحت راوړي، ټول په یوه پلیټ فارم کې په میاشت کې یوازې $ 19 پیل کیږي. د لسګونو منحل شوي وسیلو جال کول بند کړئ او د ښه ډیزاین شوي سافټویر دقیقیت سره خپل سوداګرۍ پیل کړئ. نن په 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