[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]
لینک منبع