projects:hpx:start
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
projects:hpx:start [2020/05/16 15:45] – agaev | projects:hpx:start [2020/06/08 10:30] (current) – agaev | ||
---|---|---|---|
Line 40: | Line 40: | ||
static void retire( T * p ) | static void retire( T * p ) | ||
- | Disposer это шаблонный параметр, | + | Disposer это шаблонный параметр, |
if на linux и membarrier | if на linux и membarrier | ||
Line 62: | Line 62: | ||
Дополнительные вещи, не из стандарта: | Дополнительные вещи, не из стандарта: | ||
+ | |||
hazptr_array< | hazptr_array< | ||
+ | |||
hazptr_local< | hazptr_local< | ||
+ | |||
+ | ====== p1121 (последний) ====== | ||
+ | header < | ||
+ | |||
+ | // ?.?, Class hazard_pointer_domain: | ||
+ | class hazard_pointer_domain; | ||
+ | |||
+ | // ?.?, Default hazard_pointer_domain: | ||
+ | hazard_pointer_domain& | ||
+ | |||
+ | // ?.?, For a set of hazard_pointer_obj_base objects O in domain for whichO.retire(reclaim, | ||
+ | void hazard_pointer_clean_up( | ||
+ | |||
+ | // ?.?, Class template hazard_pointer_obj_base: | ||
+ | template < | ||
+ | |||
+ | // ?.?, Class hazard_pointer | ||
+ | class hazard_pointer; | ||
+ | |||
+ | // ?.?, Construct non-empty hazard_pointer | ||
+ | hazard_pointer make_hazard_pointer( | ||
+ | |||
+ | // ?.?, Hazard pointer swap | ||
+ | void swap(hazard_pointer&, | ||
+ | |||
+ | class hazard_pointer_domain { | ||
+ | public: | ||
+ | // ?.?.? constructor: | ||
+ | explicit hazard_pointer_domain( | ||
+ | ... | ||
+ | } | ||
+ | | ||
+ | class hazard_pointer { | ||
+ | public: | ||
+ | ... | ||
+ | bool empty() const noexcept; | ||
+ | template < | ||
+ | template < | ||
+ | template < | ||
+ | void reset_protection(nullptr_t = nullptr) noexcept; | ||
+ | void swap(hazard_pointer& | ||
+ | |||
+ | |||
+ | ====== Аргумент против standard proposal(Hooks) ====== | ||
+ | [[https:// | ||
+ | |||
+ | В стандарте сейчас используется что-то похожее на base_hook | ||
+ | |||
+ | В Boost.Intrusive говорится(И это и есть аргумент): | ||
+ | Sometimes an ' | ||
+ | In this case, using a member hook as a data member instead of ' | ||
+ | А потом ещё и | ||
+ | A programmer might find that base or member hooks are not flexible enough in some situations. | ||
+ | In some applications it would be optimal to put a hook deep inside a member of a class or just outside the class. | ||
+ | Boost.Intrusive has an easy option to allow such cases: function_hook. | ||
+ | |||
+ | ===== Как можно исправить ===== | ||
+ | |||
+ | И кажется, | ||
+ | |||
+ | Стандарт говорит, | ||
+ | |||
+ | Я могу предложить аналог member_hook: | ||
+ | |||
+ | А аналог function_hook могу предложить такой: | ||
+ | |||
+ | Boost.Intrusive: | ||
+ | //This functor converts between value_type and a hook_type | ||
+ | struct Functor | ||
+ | { | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | }; | ||
+ | |||
+ | My version(hook -> hazptr): | ||
+ | //This functor converts between value_type and a hazptr_type | ||
+ | struct Functor | ||
+ | { | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | }; | ||
+ | |||
+ | То есть с помощью Functor нужно будет самому задать, | ||
+ | |||
+ | Кажется бесполезное преимущество, | ||
+ | |||
+ | В массиве HP в libcds хранится каст к void*. В proposal' | ||
+ | |||
+ | Моя идея в том, чтобы как и в Boost.Intrusive, | ||
+ | |||
+ | ===== Почему их hazptr_obj_base -- плохо? ===== | ||
+ | |||
+ | Как говорится в Boost.Intrusive: | ||
+ | |||
+ | Мои варианты: | ||
+ | Function hook решает эту проблему. | ||
+ | |||
+ | ===== Альтернативные варианты ==== | ||
+ | |||
+ | Наша задача, | ||
+ | |||
+ | В protect мы кладём какой-то указатель, | ||
+ | |||
+ | Сейчас это isDefendedBy == isSame для libcds, и static_cast< | ||
+ | |||
+ | Это позволит делать улучшенную логику. К примеру, | ||
+ | |||
+ | ====== Is HP obsolete? ====== | ||
+ | |||
+ | Hazard eras: http:// | ||
+ | |||
+ | Wait free eras: https:// |
projects/hpx/start.1589633124.txt.gz · Last modified: 2020/05/16 15:45 by agaev