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
Last revisionBoth sides next revision
projects:hpx:start [2020/05/29 00:05] agaevprojects:hpx:start [2020/06/01 18:04] 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[[https://www.boost.org/doc/libs/1_54_0/doc/html/intrusive/usage.html|Boost.Intrusive]]+====== Аргумент против standard proposal(Hooks) ====== 
 +[[https://www.boost.org/doc/libs/1_54_0/doc/html/intrusive/usage.html|Boost.Intrusive]] 
 В стандарте сейчас используется что-то похожее на base_hook В стандарте сейчас используется что-то похожее на base_hook
-В 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:+В 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:
 А потом ещё и А потом ещё и
- 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.  
 + 
 +===== Как можно исправить =====
  
 И кажется, что в стандарт можно записать эти три варианта сразу. То есть позволить программисту самому определять, как он хочет, чтобы указатель на его структуру преобразовывался в указатель на HP. И кажется, что в стандарт можно записать эти три варианта сразу. То есть позволить программисту самому определять, как он хочет, чтобы указатель на его структуру преобразовывался в указатель на HP.
Line 130: 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 151: 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.
 +
 +Это позволит делать улучшенную логику. К примеру, когда, пытаясь удалить какой-то объект, мы должны убедиться, что никто не защищает его потомков(К примеру, удаляя узел дерево, мы должны убедиться, что дети и далее не защищены).
projects/hpx/start.txt · Last modified: 2020/06/08 10:30 by agaev