Size: a a a

2020 June 17

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
dismiss_button называется guard :)
Ну если там F это generic функция, без всяких unique, то без shared не обойтись. Shared это провод от dismiss_button до dismissable_fn.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну если там F это generic функция, без всяких unique, то без shared не обойтись. Shared это провод от dismiss_button до dismissable_fn.
Там в любом случае без shared не обойтись, операция на самом деле make_shared_dismissable
источник

CD

Constantine Drozdov in pro.cxx
Интересно, есть вообще штатное название для метода
void left_blackhole(T& t) { t_ = std::move(t); }
который переводит объект в moved out state?
источник

CD

Constantine Drozdov in pro.cxx
не использовать же имена unique_blackhole и shared_blackhole :)
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Там в любом случае без shared не обойтись, операция на самом деле make_shared_dismissable
Но если всё таки в очереди есть какой то  basic task который сам по себе shared, чего бы ему не приделать прям в виде базовой функциональности dismiss?
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Но если всё таки в очереди есть какой то  basic task который сам по себе shared, чего бы ему не приделать прям в виде базовой функциональности dismiss?
Я пока застрял на уровне восстановления концепта из TypeErasure
источник

CD

Constantine Drozdov in pro.cxx
А именно на том, как называется метод dismiss на самом деле
источник

CD

Constantine Drozdov in pro.cxx
То есть тут на самом деле два метода
1) operator () &&
2) shared_blackhole? операция, которая переводит объект по левой ссылке в moved out state
источник

CD

Constantine Drozdov in pro.cxx
Ты меня понимаешь? :))
источник

CD

Constantine Drozdov in pro.cxx
В многопоточном случае это был бы какой-то эквивалент сущностей типа shared_mutex с раздельным личным и общим доступом
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
В многопоточном случае это был бы какой-то эквивалент сущностей типа shared_mutex с раздельным личным и общим доступом
Ну в многопоточном варианте можно какой нить shared atomic flag выставить типа dismised и проверять перед invoke либо реально лочиться (например на уровне самого сообщения, через spinlock на shared bool) и убивать payload если прям так важно сделать dismiss с освобождением ресурсов.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну в многопоточном варианте можно какой нить shared atomic flag выставить типа dismised и проверять перед invoke либо реально лочиться (например на уровне самого сообщения, через spinlock на shared bool) и убивать payload если прям так важно сделать dismiss с освобождением ресурсов.
Мне все еще очень сильно кажется, что dismiss это намного более универсальная операция
источник

CD

Constantine Drozdov in pro.cxx
void shared_blackhole(T& t) { auto t_ = std::move(t); }

которая записывается вот примерно так
источник

CD

Constantine Drozdov in pro.cxx
собственно для std::function
void dismiss() noexcept override { utils::blackhole(std::move(wrapped_)); };
просто является разумной реализацией (с точностью до bad_function_call, но это точно плохо?)
источник

CD

Constantine Drozdov in pro.cxx
template<typename T> void blackhole(T&& t) { /*static_assert T is not reference*/ auto unused = std::move(t); }
черная дыра для уникального владельца прилагается
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну в многопоточном варианте можно какой нить shared atomic flag выставить типа dismised и проверять перед invoke либо реально лочиться (например на уровне самого сообщения, через spinlock на shared bool) и убивать payload если прям так важно сделать dismiss с освобождением ресурсов.
В многопоточной среде там должен собственно встать recursive_shared_mutex, потому что operator() && должен заблокировать возможность dismiss
источник

CD

Constantine Drozdov in pro.cxx
Это единственный способ гарантировать, что dismiss отпускает все ссылки
источник

CD

Constantine Drozdov in pro.cxx
(возможно, не recursive, вызов dismiss в operator() не дает такой гарантии)
источник

DS

Dmitry Sokolov in pro.cxx
Хз, вроде как для той же function = nullptr это и есть reset, вызов ~F, зачем move?
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Хз, вроде как для той же function = nullptr это и есть reset, вызов ~F, зачем move?
Не нужен, конечно. Это пример, что эта реализация работает
источник