X

زبان برنامه نویسی C ++: نشانگرهای خطرناک در C ++ 26

[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]

لینک منبع

Categories: اخبار
تیوبر: لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد.