Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


projects:hpx:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
projects:hpx:start [2020/05/29 00:06] agaevprojects:hpx:start [2020/06/08 10:30] (current) agaev
Line 62: Line 62:
  
 Дополнительные вещи, не из стандарта: Дополнительные вещи, не из стандарта:
 +
 hazptr_array<N> для N hazptr-ов сразу, быстрее. hazptr_array<N> для N hazptr-ов сразу, быстрее.
 +
 hazptr_local<N> немного быстрее, но обязывает иметь ровно 1 активный hazptr_* на поток hazptr_local<N> немного быстрее, но обязывает иметь ровно 1 активный hazptr_* на поток
  
Line 95: Line 97:
         ...         ...
         }         }
 +        
 +        class hazard_pointer { 
 +        public:  
 + ...
 + bool empty() const noexcept;
 + template <typename T>    T* protect(const atomic<T*>& src) noexcept;
 + template <typename T>  bool try_protect(T*& ptr, const atomic<T*>& src) noexcept;
 + template <typename T>  void reset_protection(const T* ptr) noexcept;
 + void reset_protection(nullptr_t = nullptr) noexcept;
 + void swap(hazard_pointer&) noexcept;};
  
  
 ====== Аргумент против standard proposal(Hooks) ====== ====== Аргумент против standard proposal(Hooks) ======
 [[https://www.boost.org/doc/libs/1_54_0/doc/html/intrusive/usage.html|Boost.Intrusive]] [[https://www.boost.org/doc/libs/1_54_0/doc/html/intrusive/usage.html|Boost.Intrusive]]
 +
 В стандарте сейчас используется что-то похожее на base_hook В стандарте сейчас используется что-то похожее на base_hook
 +
 В Boost.Intrusive говорится(И это и есть аргумент): В Boost.Intrusive говорится(И это и есть аргумент):
- Sometimes an 'is-a' relationship between list hooks and the list value types is not desirable. In this case, using a member hook as a data member instead of 'disturbing' the hierarchy might be the right way:+ Sometimes an 'is-a' relationship between list hooks and the list value types is not desirable. 
 + In this case, using a member hook as a data member instead of 'disturbing' the hierarchy might be the right way:
 А потом ещё и А потом ещё и
- 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. + 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. 
  
 ===== Как можно исправить ===== ===== Как можно исправить =====
Line 133: Line 150:
         };         };
  
-My version:+My version(hook -> hazptr):
  //This functor converts between value_type and a hazptr_type  //This functor converts between value_type and a hazptr_type
         struct Functor         struct Functor
Line 154: Line 171:
  
 Кажется бесполезное преимущество, т.к. добавляет память : Более того, можно будет добавить данных в хуки(hazptr_obj_base), и тем самым влиять на структуру массива HP(сделать его Boost.Intrusive.list). Я не придумал ещё полезных применений(можно хранить timestamp, можно хранить указатель на функцию, которую вызывать при освобождении hp(для статистики мб)) Кажется бесполезное преимущество, т.к. добавляет память : Более того, можно будет добавить данных в хуки(hazptr_obj_base), и тем самым влиять на структуру массива HP(сделать его Boost.Intrusive.list). Я не придумал ещё полезных применений(можно хранить timestamp, можно хранить указатель на функцию, которую вызывать при освобождении hp(для статистики мб))
 +
 +В массиве HP в libcds хранится каст к void*. В proposal'е каст к hazptr_obj_base*.
 +
 +Моя идея в том, чтобы как и в Boost.Intrusive, добавить к hazptr_domain или hazard_pointer::protect шаблонный параметр, указывающий на то, как получать hazptr_ptr из нашего класса
 +
 +===== Почему их hazptr_obj_base -- плохо? =====
 +
 +Как говорится в Boost.Intrusive: Sometimes an 'is-a' relationship between list hooks and the list value types is not desirable.
 +
 +Мои варианты: Множественное наследование от двух типов, каждый из которых наследуется от hazptr_obj_base
 +Function hook решает эту проблему.
 +
 +===== Альтернативные варианты ====
 +
 +Наша задача, по сути, научиться определять, защищен ли в текущий момент такой вот указатель(Тип его не знаем(void*), либо RTTI). То есть необходимо сравнить его с другими Hazard Pointers, и определить, равняются ли они, логически.
 +
 +В protect мы кладём какой-то указатель, в retire программист должен дать какой-то isDefendedBy(HP*), с помощью которого можно будет определить, защищен ли сейчас объект, который мы хотим удалить.
 +
 +Сейчас это isDefendedBy == isSame для libcds, и static_cast<hazptr_obj_base>::isSame() для folly и prorosals.
 +
 +Это позволит делать улучшенную логику. К примеру, когда, пытаясь удалить какой-то объект, мы должны убедиться, что никто не защищает его потомков(К примеру, удаляя узел дерево, мы должны убедиться, что дети и далее не защищены).
 +
 +====== Is HP obsolete? ======
 +
 +Hazard eras: http://concurrencyfreaks.blogspot.com/2017/05/hazard-eras-non-blocking-memory.html
 +
 +Wait free eras: https://rusnikola.github.io/files/wfe-ppopp20.pdf
projects/hpx/start.1590699975.txt.gz · Last modified: 2020/05/29 00:06 by agaev