Hacker News

تێگەیشتن لە Std:Shared_mutex لە C++17

کۆمێنتەکان

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

تێگەیشتن لە std::shared_mutex لە C++17

std::shared_mutex، کە لە C++17 ناسێنراوە، سەرەتایییەکی هاوکاتکردنە کە ڕێگە بە چەندین تەوەر دەدات لە یەک کاتدا قوفڵی هاوبەش (خوێندنەوە) ڕابگرن لە هەمان کاتدا دەستڕاگەیشتنێکی تایبەت بۆ کارەکانی نووسین مسۆگەر دەکات. یەکێک لە باوترین تەحەددیاتی هاوکات لە ++C مۆدێرن چارەسەر دەکات بە پێدانی ڕێگەیەکی پاک و ستاندارد بە گەشەپێدەران بۆ جێبەجێکردنی قفڵکردنی خوێنەر-نووسەر بەبێ ئەوەی دەست بگات بە کتێبخانەی لایەنی سێیەم یان API تایبەت بە پلاتفۆرم.

std::shared_mutex بەڕاستی چییە و بۆچی لە C++17 زیادکرا؟

پێش C++17، ئەو گەشەپێدەرانەی کە پێویستیان بە واتاسازی خوێنەر-نووسەر بوو، دەبوو پشت بە چارەسەرە تایبەتەکانی پلاتفۆرم ببەستن وەک pthread_rwlock_t لەسەر سیستەمی POSIX یان 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 بەکاردەهێنن بە تایبەتی بەنرخن چونکە لۆژیکی هاوکاتی بەناوبانگە کە سەختە بۆ ئیستدلالکردن. سەرنجە باشەکان ڕوونی دەکەنەوە کە بۆچی جۆرێکی قوفڵی تایبەت هەڵبژێردرا، کە بە شێوەیەکی سەرنجڕاکێش مەترسی ئەوە کەمدەکاتەوە کە پارێزەرانی داهاتوو بە هەڵە ڕەگەزەکانی داتا بناسێنن. لێرەدا نەخشێکی تایبەت دەخەینەڕوو:

#include 
#<نەخشەی_ڕێزبەندی نەکراو> لەخۆ بگرێت
#include 

class تۆمارکردنی ڕێکخستن {
    گۆڕاو std::shared_mutex mtx_; // نەخشەی خوارەوە دەپارێزێت
    std::نەخشەی_ناڕێکخراو داتا_;

گشتی:
    // ڕێڕەوی خوێندنەوە: ڕەنگە چەندین تەوەر لە یەک کاتدا ئەمە بانگ بکەن
    std::string get(const std::ڕیز& کلیل) const {
        std::قفڵی_بەشدار (mtx_); // قوفڵی هاوبەش — سەلامەتە بۆ خوێندنەوە هاوکاتەکان
        ئۆتۆماتیکی ئەوە = داتا_.دۆزینەوە (کلیل);
        گەڕانەوەی != data_.end() ? it->second : "";
    }

    // ڕێڕەوی نووسین: دەستڕاگەیشتنێکی تایبەت پێویستە
    void set(const std::string& کلیل، const std::ڕیز& val) {
        std::قفڵی_ناوازە (mtx_); // قوفڵی تایبەت — هەموو خوێنەران بلۆک دەکات
        داتا_[کلیل] = val;
    }
};

سەرنج بدە کە چۆن کۆمێنتەکان مەبەستی پشت هەر هەڵبژاردنێکی قوفڵ ڕوون دەکەنەوە نەک تەنها دووبارە باس لەوە بکەنەوە کە کۆدەکە چی دەکات. ئەمە ستانداردی زێڕینە: کۆمێنتەکان دەبێ وەڵامی بۆچی بدەنەوە، نەک چی. وشەی سەرەکی mutable لەسەر 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() بۆ هەوڵە کاتیەکان زیاد دەکات. std::shared_mutex ی C++17 جۆرە کاتییەکان دەخاتە خوارەوە بۆ جێبەجێکردنێکی لاوازتر. ئەگەر پێویستت بە قفڵکردنی کاتی لەسەر ڕێڕەوی هاوبەشە، 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 بەکاردەهێنم سەرنج زیاد بکەم؟

بەلایەنی کەمەوە، کۆمێنت لەسەر ڕاگەیاندنی mutex بکە بۆ ئەوەی باس لەوە بکەیت کە چ داتایەک دەپارێزێت و ئەو نەگۆڕانە کە دەیپارێزێت. لە هەر سایتێکی قوفڵدا، سەرنجێکی کورت کە ڕوونی دەکاتەوە کە بۆچی دەستگەیشتنێکی هاوبەش لە بەرامبەر دەستگەیشتنێکی تایبەت هەڵبژێردرا، بەهایەکی بەرچاو بۆ پێداچوونەوەکارانی کۆد و پارێزەرانی داهاتوو زیاد دەکات. هەڵەکانی هاوکات لە سەختترینەکانن بۆ دووبارە بەرهەمهێنانەوە و چاککردنەوە، بۆیە وەبەرهێنان لە سەرنجە ڕوون و وردەکاندا چەندین هێندە زیاتر سوودی دەبێت.


بەڕێوەبردنی سیستەمی ئاڵۆز - جا کۆدی ++C هاوکات بێت یان تەواوی کارپێکردنی بازرگانی - داوای ئامرازی دروست و پێکهاتەی ڕوون دەکات. Mewayz سیستەمی کارپێکردنی بازرگانی 207 مۆدیۆلییە کە زیاتر لە 138,000 بەکارهێنەر متمانەی پێدەکەن بۆ هێنانی هەمان ڕوونی بۆ مارکێتینگ، CRM، بازرگانی ئەلیکترۆنی، شیکاری و زۆر شتی تر، هەموو ئەمانە لە یەک پلاتفۆرمدا تەنها لە 19 دۆلارەوە دەستپێدەکات لە مانگێکدا. واز لە مامەڵەکردن لەگەڵ دەیان ئامرازی پچڕاو بهێنە و دەست بکە بە بەڕێوەبردنی کارەکەت بە وردی نەرمەکاڵایەکی باش دیزاینکراو. ئەمڕۆ Mewayz تاقی بکەرەوە لە app.mewayz.com و بزانە چۆن سیستەمێکی یەکگرتوو شێوازی کارکردنی تیمەکەت دەگۆڕێت.

دەدات

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