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 16:01] – 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< | ||
| Line 74: | Line 76: | ||
| hazard_pointer_domain& | hazard_pointer_domain& | ||
| - | // ?.?, Clean up | + | // ?.?, For a set of hazard_pointer_obj_base objects O in domain for whichO.retire(reclaim, |
| void hazard_pointer_clean_up( | void hazard_pointer_clean_up( | ||
| Line 95: | Line 97: | ||
| ... | ... | ||
| } | } | ||
| + | | ||
| + | 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.1589634067.txt.gz · Last modified: 2020/05/16 16:01 by agaev