[ad_1]
این مقاله وبلاگ یک آزمایش را نشان می دهد: چند روز پیش ایمیل زیر را از الیور شادلیچ دریافت کردم. اگر این مقاله ، همانطور که امیدوارم ، بحث و گفتگو را برانگیزد ، خوشحال می شوم که آن را در مقاله بعدی خود خلاصه کنم. لطفاً برای Rainer Grimm ایمیل بنویسید.
راینر گریم سالهاست که به عنوان معمار نرم افزار ، تیم و مدیر آموزش کار می کند. او دوست دارد مقالاتی را در مورد زبان های برنامه نویسی C ++ ، Python و Haskell بنویسد ، اما همچنین دوست دارد در کنفرانس های تخصصی صحبت کند. در وبلاگ خود C ++ Modern ، او با اشتیاق C ++ خود به شدت سر و کار دارد.
نامه از الیور شادلیچ:
“من به تازگی مقاله فعلی شما را در مورد Hazard Pointer با خارج از RCU در Heise خوانده ام. با الهام از سخنرانی در YouTube به انواع بدون قفل atomic>
من یک بار فکر کردم: شما لازم نیست که آنقدر پیچیده باشید. در اصل شما می توانید چیزی شبیه به آن را دوست داشته باشید atomic>
به سادگی با قفل و هنگام به روزرسانی پیاده سازی کنید shared_ptr
از مرکز atomic>
مقایسه اتمی با shared_ptr
انجام شده
به عنوان یک قاعده ، این موردی است که با الگوهای شبیه RCU با یک مرکز atomic>
این نسبتاً به ندرت به روز می شود ، اما اغلب به روزرسانی مقدار فعلی را دریافت می کنید. به عنوان یک قاعده ، که هر دو نشانگر یک چیز را نشان می دهند ، شما فقط جذب نمی کنید و به روزرسانی بسیار سریع دارید زیرا تمام خطوط حافظه پنهان درگیر همچنان باز می شوند shared
ایستاده
من آن را با VS 2022 و به روزرسانی shared_obj
از مرکز tshared_obj
هزینه حدود 1.5 نانو ثانیه در پردازنده Zen4 من است. راه حل آنقدر ساده است که من تعجب کردم که چرا هنوز کسی به آن نرسیده است.
در اصل می توانستید shared_ptr
از C ++ به یک اپراتور واگذاری که یکی از آنها را بدهید atomic>
همان چیز را می گیرد در حال حاضر آن را اجرا می کند atomic>
سپس مخالف shared_ptr
Castet و یک کپی نسبتاً گران قیمت بوجود می آید. LibSTDC ++ و MSVC در حال حاضر در این مرحله با یک قفل کار می کنند ، که اگر طبق پرونده ویژه مشخص شده عمل کنید ، هنوز مشکلی نخواهد بود. شاید بتوانید این ایده را به مکانی مناسب ادامه دهید که چیزی شبیه به این در هر یک از استانداردهای بعدی پیدا شود.
در اینجا کدی است که الیور شادیچ برای من ارسال کرده است. در C ++ 20 نوشته شده و از کتابخانه استاندارد استفاده می کند. پرونده ها عبارتند از:
- futex.cpp
- main.cpp
- cl_size.h
- futex.h
- shared_obj.h
منابع بارگیری
جالب ترین پرونده به اشتراک گذاشته شده_OBJ.H و عملکرد زیر است:
template
shared_obj &shared_obj::operator =( tshared_obj const &tso ) noexcept
{
using namespace std;
ctrl_t *ctrl = tso.m_ctrl.load( memory_order_relaxed );
if( ctrl == m_ctrl )
return *this;
if( m_ctrl )
{
if( m_ctrl->decr() == 1 )
delete m_ctrl;
m_ctrl = nullptr;
}
lock_guard::mutex_t> lock( tso.m_mtx );
ctrl = tso.m_ctrl.load( memory_order_relaxed );
m_ctrl = ctrl;
ctrl->incr();
return *this;
}
وقتی من اول هستم if
با return *this
دور شوید ، کد چند هزار برابر کندتر است ، تقریباً به همان اندازه به روزرسانی یکی کند است shared_ptr
از یک atomic>
بشر
چگونه ادامه می دهید؟
RCU مخفف Read Copy Update است ، یک فناوری هماهنگ سازی برای ساختارهای داده محافظت شده تقریباً به طور انحصاری که توسط پل مک کننی ساخته شده است و از سال 2002 در هسته لینوکس مورد استفاده قرار گرفته است. RCU در حال حاضر در ارتباط با نشانگرهای خطر ذکر شده است.
(سازمان بهداشت جهانی)
[ad_2]
لینک منبع