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/14 16:58] – agaev | projects:hpx:start [2020/06/08 10:30] (current) – agaev | ||
---|---|---|---|
Line 16: | Line 16: | ||
В p0233 написано "Due to the performance advantages of using TLS, the library implementation should allow the programmer to choose implementation paths that benefit from TLS when suitable, and avoid TLS when incompatible with the use case." | В p0233 написано "Due to the performance advantages of using TLS, the library implementation should allow the programmer to choose implementation paths that benefit from TLS when suitable, and avoid TLS when incompatible with the use case." | ||
- | + | ====== | |
- | libcds: | + | |
cds:: | cds:: | ||
cds::gc::HP hpGC; once | cds::gc::HP hpGC; once | ||
Line 35: | Line 34: | ||
Guard:: | Guard:: | ||
Guard:: | Guard:: | ||
+ | |||
+ | Приводит T* к void* и работает с этими указателями. | ||
+ | |||
+ | template <class Disposer, typename T> | ||
+ | static void retire( T * p ) | ||
+ | |||
+ | Disposer это шаблонный параметр, | ||
+ | |||
+ | if на linux и membarrier | ||
+ | |||
+ | ====== folly ====== | ||
+ | Аналог Guard, protect == get_protected | ||
+ | hazptr_holder: | ||
+ | T* hazptr_holder:: | ||
+ | В folly Используется T*, в libcds: T | ||
+ | |||
+ | Все T обязаны наследоваться от hazptr_obj_base< | ||
+ | template < | ||
+ | typename T, | ||
+ | template < | ||
+ | typename D = std:: | ||
+ | class hazptr_obj_base { | ||
+ | void retire( D deleter = {}, hazptr_domain< | ||
+ | } | ||
+ | |||
+ | hazptr_domain в folly есть, но он не умеет в разные аллокаторы, | ||
+ | |||
+ | Дополнительные вещи, не из стандарта: | ||
+ | |||
+ | hazptr_array< | ||
+ | |||
+ | 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.1589464726.txt.gz · Last modified: 2020/05/14 16:58 by agaev