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:12] 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 156: Line 173:
  
 В массиве HP в libcds хранится каст к void*. В proposal'е каст к hazptr_obj_base*. В массиве HP в libcds хранится каст к void*. В proposal'е каст к hazptr_obj_base*.
-Моя идея в том, чтобы как и в Boost.Intrusive, добавить к чему-то шаблонный параметр, указывающий на то, как получать hazptr_ptr из нашего класса+ 
 +Моя идея в том, чтобы как и в 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.1590700376.txt.gz · Last modified: 2020/05/29 00:12 by agaev