Hacker News

C++17 થી ધોરણ: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 માં રજૂ કરવામાં આવ્યું છે, એ એક સિંક્રોનાઇઝેશન પ્રિમિટિવ છે જે એકસાથે બહુવિધ થ્રેડોને શેર કરેલ (વાંચવા) લૉક રાખવા માટે પરવાનગી આપે છે જ્યારે લેખન ઑપરેશન માટે વિશિષ્ટ ઍક્સેસ સુનિશ્ચિત કરે છે. તે વિકાસકર્તાઓને તૃતીય-પક્ષ લાઇબ્રેરીઓ અથવા પ્લેટફોર્મ-વિશિષ્ટ APIs સુધી પહોંચ્યા વિના રીડર-રાઇટર લૉકિંગને અમલમાં મૂકવાની સ્વચ્છ, માનક રીત આપીને આધુનિક C++માં સૌથી સામાન્ય સહવર્તી પડકારોમાંથી એકને ઉકેલે છે.

std::shared_mutex બરાબર શું છે અને તેને C++17માં શા માટે ઉમેરવામાં આવ્યું હતું?

C++17 પહેલાં, વિકાસકર્તાઓ કે જેમને રીડર-રાઇટર સિમેન્ટિક્સની જરૂર હતી, તેઓએ POSIX સિસ્ટમ્સ પર pthread_rwlock_t જેવા પ્લેટફોર્મ-વિશિષ્ટ ઉકેલો અથવા Windows પર SRWLOCK પર આધાર રાખવો પડતો હતો અથવા તેઓ બૂસ્ટ જેવી તૃતીય-પક્ષ લાઇબ્રેરીઓનો ઉપયોગ કરતા હતા. 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 
# સમાવેશ થાય છે 
# સમાવેશ થાય છે 

વર્ગ 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() ? તે->બીજો : "";
    }

    // પાથ લખો: વિશિષ્ટ ઍક્સેસ આવશ્યક છે
    રદબાતલ સમૂહ(const std::string& key, const std::string & val) {
        std::unique_lock lock(mtx_); // વિશિષ્ટ લોક — બધા વાચકોને અવરોધિત કરે છે
        data_[key] = val;
    }
};

કોડ શું કરે છે તે પુનરાવર્તિત કરવાને બદલે ટિપ્પણીઓ દરેક લોક પસંદગી પાછળના ઉદ્દેશ્યને કેવી રીતે સમજાવે છે તેની નોંધ લો. આ ગોલ્ડ સ્ટાન્ડર્ડ છે: ટિપ્પણીઓએ શા માટે જવાબ આપવો જોઈએ, શું નહીં. મ્યુટેક્સ પરનો પરિવર્તનશીલ કીવર્ડ get()ને લોક કરવામાં સક્ષમ હોવા છતાં const જાહેર કરવાની મંજૂરી આપે છે, જે એક સામાન્ય અને રૂઢિપ્રયોગાત્મક પેટર્ન છે.

કી ઇનસાઇટ: હંમેશા RAII લૉક રેપરનો ઉપયોગ કરો (std::shared_lock, std::unique_lock) std::shared_mutex સાથે — ક્યારેય lock() અને manual()ને કૉલ કરશો નહીં. અપવાદોની હાજરીમાં મેન્યુઅલ લોકીંગ એ ડેડલૉક્સ અને અવ્યાખ્યાયિત વર્તણૂક માટે બાંયધરીકૃત માર્ગ છે.

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_mutexstd::shared_lock સાથે જોડી બનાવી છે.

જ્યારે પણ હું std::shared_mutex નો ઉપયોગ કરું ત્યારે શું મારે ટિપ્પણીઓ ઉમેરવી જોઈએ?

ઓછામાં ઓછા, મ્યુટેક્સની ઘોષણા પર ટિપ્પણી કરો કે તે કયા ડેટાને સુરક્ષિત કરે છે અને તે કયા અપ્રતિરોને જાળવી રાખે છે. દરેક લૉક સાઇટ પર, એક સંક્ષિપ્ત ટિપ્પણી સમજાવે છે કે શા માટે વહેંચાયેલ વિરુદ્ધ એક્સક્લુઝિવ એક્સેસ પસંદ કરવામાં આવી હતી તે કોડ સમીક્ષકો અને ભાવિ જાળવણીકારો માટે નોંધપાત્ર મૂલ્ય ઉમેરે છે. કોનકરન્સી બગ્સ પુનઃઉત્પાદન અને ઠીક કરવા માટે સૌથી મુશ્કેલ છે, તેથી સ્પષ્ટ, ચોક્કસ ટિપ્પણીઓમાં રોકાણ ઘણી વખત ડિવિડન્ડ ચૂકવે છે.


જટિલ પ્રણાલીઓનું સંચાલન કરવું - પછી ભલે તે સહવર્તી C++ કોડ હોય કે સમગ્ર વ્યવસાયિક કામગીરી - યોગ્ય સાધનો અને સ્પષ્ટ માળખાની માંગ કરે છે. Mewayz એ 138,000 વપરાશકર્તાઓ દ્વારા વિશ્વાસપાત્ર 207-મોડ્યુલ બિઝનેસ OS છે જે માર્કેટિંગ, 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