این مقاله را به اشتراک بگذارید
[ad_1]
C ++ 26 نشانگر خطر را معرفی می کند. پیشنهاد P2530R3 توضیح خوبی در مورد آنچه در آن است ارائه می دهد:
راینر گریم سالهاست که به عنوان معمار نرم افزار ، تیم و مدیر آموزش کار می کند. او دوست دارد مقالاتی را در مورد زبان های برنامه نویسی C ++ ، Python و Haskell بنویسد ، اما همچنین دوست دارد در کنفرانس های تخصصی صحبت کند. در وبلاگ خود C ++ Modern ، او با اشتیاق C ++ خود به شدت سر و کار دارد.
یک نشانگر خطر یک نشانگر چند خواننده تک نویسنده است که می تواند در هر زمان حداکثر یک موضوع باشد. فقط صاحب نشانگر Hazard می تواند مقدار خود را تعیین کند ، در حالی که هر تعداد از موضوعات ممکن است مقدار آن را بخواند. موضوعی که قصد دسترسی به اشیاء پویا را دارد ، مالکیت Pointer (های) Hazard را برای محافظت از چنین اشیاء از پس گرفتن به دست می آورد. موضوع مالک مقدار یک نشانگر خطر را برای اشاره به یک شیء به منظور نشان دادن موضوعات همزمان – که ممکن است چنین شیء را از بین ببرد – تعیین می کند که این شیء هنوز برای بازپس گیری ایمن نیست.
نشانگرهای خطرناک توسط موضوعاتی که به عنوان دسترسی/محافظان عمل می کنند ، متعلق و نوشته شده است (یعنی از اشیاء قابل جابجایی در برابر احیای ناامن به منظور دسترسی به چنین اشیاء محافظت می کنند) و توسط موضوعاتی خوانده می شوند که به عنوان حذف کننده/بازپرداخت عمل می کنند (یعنی ممکن است حذف و تلاش برای بازپس گیری اشیاء). حذف اشیاء بازنشسته اشیاء را به کتابخانه Pointer Hazard حذف کرده است (یعنی مسئولیت بازپس گیری اشیاء را به کد کتابخانه به جای اینکه به طور عادی توسط کد کاربر انجام شود ، منتقل می کند). ممکن است مجموعه ای از محافظ و حذف موضوعات با هم همپوشانی داشته باشد.
حفاظت و بهبودی
به طور خلاصه ، نشانگرهای خطرناک تضمین می کنند که در صورت لزوم دیگر اشیاء ارجاع شده حذف می شوند. نشانگرهای خطرناک عملکردهای محافظتی و تاخیر را انجام می دهند و با یکدیگر تعامل دارند.
- محافظت: شما تضمین می کنید که اشیاء فقط در صورت نیاز به آنها نابود می شوند.
- دریافت بازیابی: اشیاء خارج شده را جمع می کند و مقادیر آنها را در یک مجموعه استخراج می کند. مقادیر همه نشانگرهای خطرناک را می خواند و آنها را با آدرس مقادیر استخراج شده در مجموعه مقایسه می کند. اگر مقداری از مجموعه در مقادیر نشانگرهای خطر یافت نشود ، می توان آن را از بین برد. هنگامی که پیدا شد ، آن را به مجموعه اشیاء خارج شده اضافه می کند.
صحت و عملکرد
مزایای نشانگرهای خطرناک چیست؟ پاسخ من شامل دو نکته است: صحت و عملکرد. صحت را می توان با استفاده از یک مثال ساده نشان داد:
Node* currentNode = this->head;
Node* nextNode = currentNode->next;
سوال مهم در مورد این گردنبند کد کوچک این است: چگونه می توانیم اطمینان حاصل کنیم که currentNode
هنوز معتبر است؟ در حالی که یک موضوع این کد را انجام می دهد ، ممکن است موضوع دیگری در حال حاضر طول بکشد currentNode
به
عملیات مقایسه اتمی و مبادله (CAS) این مشکل را محکم می کند. در C ++ ، این عمل به طور معمول برای این منظور است compare_exchange_strong
استفاده شده با این حال ، عملیات CAS از مشکل ABA رنج می برد. من در مورد جزئیات بیشتر در مورد مشکل ABA در مقاله خود در مورد بازپس گیری معوق در C ++ 26: به روزرسانی کپی و نشانگرهای خطرناک بحث می کنم. راه حل مشکل واضح است: جمع آوری زباله های اتوماتیک. این دقیقاً همان چیزی است که نشانگرهای خطرناک ارائه می دهند.
با C ++ 14 ، قفل های نویسنده خواننده معرفی شدند. با استفاده از این قفل های ویژه ، موضوعات خواندن متفاوت از نوشتن موضوعات است. این بدان معنی است که هر تعداد از موضوعات خواندن را می توان همزمان انجام داد ، اما فقط یک موضوع نوشتن است. در نتیجه ، Writer Writer-Locks نوید عملکرد عملکرد را در مقایسه با قفل های اختصاصی نوید می بخشد.
پیشنهاد P2530R3 نمونه خوبی از ساختار داده را ارائه می دهد که بیشتر خوانده می شود. از یک قفل نویسنده کلاسیک و یک نشانگر خطر استفاده می شود.
جدول این پیشنهاد کد را با نشانگرهای خطرناک و بدون آن مقایسه می کند.
(تصویر: استانداردهای باز (Open-std.org))
تأخیر معمولی هنگام ایجاد یا حذف hazard_pointer
در اجرای حماقت در یک سرور استاندارد فعلی ، حدود 4 نانومتر است. یک پیش ساخته hazard_pointer
استفاده از استفاده از کمتر از یک نانو ثانیه معمولاً نیاز به فعال کردن محافظت دارد.
حماقت کتابخانه باز از فیس بوک اجرای مرجع نشانگرهای خطرناک را ارائه می دهد.
کلاس ها و توابع
نشانگرهای خطرناک از دو کلاس تشکیل شده است hazard_pointer_obj_base
وت hazard_pointer
و همچنین دو عملکرد make_hazard_pointer
وت swap
بشر
hazard_pointer_obj_base
کلاس اصلی کلاس است که باید محافظت شود و عملکرد آن را ارائه می دهدretire
آمادهhazard_pointer
توابع را قرار دهیدempty
باprotect
باtry_protect
باreset_protection
وتswap
موجودmake_hazard_pointer
یک اشاره گر خطر ایجاد می کند.
چه چیزی بعدی؟
RCU مخفف به روزرسانی Read Copy است و یک روش هماهنگ سازی برای ساختارهای داده است که تقریباً منحصراً قابل خواندن هستند. پل مک کننی این فناوری را توسعه داده است که از سال 2002 در هسته لینوکس مورد استفاده قرار گرفته است. RCU اغلب در رابطه با نشانگرهای خطرناک ذکر شده است و موضوع سهم بعدی من است.
(RME)
[ad_2]
لینک منبع