Size: a a a

2021 February 17

D

Dmitriy in pro.cxx
Pavel
lock-free - там же всеравно есть атомарные счетчики как минимум? Что мешает дождаться их обнуления в деструкторе? Или прям для каждого потока свой участок памяти?
Там нет счетчиков. Там (почти) классическая очередь Майкла-Скотта
источник

DS

Dmitry Sokolov in pro.cxx
Dmitriy
Как синхронизировать удаление объекта?
Дано: некий объект с двумя методами (назовем их Read() и Write()), работает в агрессивной многопоточной среде, сами методы lock-free
Задача: синхронизировать уничтожение - если объект еще читается или пишется, ждать окончания операций
Гарантируется, что новых обращений не будет, речь о "задолженностях"
Идея лочить shared_mutex в методах и деструкторе кажется крайне сомнительной
Можно hazard pointers посмотреть. Ну или вообще в каком-то виде garbage collection. Мне вот такая идея приходила: например все потоки периодически регать через какой-то callback и ввести инкрементальную эпоху. Тогда можно такой объект кинуть в "мусорку", пометив эпоху, и удалить когда все потоки эту эпоху пройдут.
источник

D

Dmitriy in pro.cxx
Dmitry Sokolov
Можно hazard pointers посмотреть. Ну или вообще в каком-то виде garbage collection. Мне вот такая идея приходила: например все потоки периодически регать через какой-то callback и ввести инкрементальную эпоху. Тогда можно такой объект кинуть в "мусорку", пометив эпоху, и удалить когда все потоки эту эпоху пройдут.
К сожалению, проблема в том, что я должен именно ждать - иначе Windows даст пинка драйверу из памяти.
Пресловутые операции не связаны с IRP и поэтому поддержки в синхронизации выгрузки со стороны ОС не будет
источник

IZ

Ilia Zviagin in pro.cxx
Constantine Drozdov
кажется, вы упускаете, что такое преобразование невозможно
если я еще не засыпаю, то преобразование B* -> D* может содержать арифметику, и записать требуемую арифметическую операцию после чтения поля в указатель на член нельзя
Невозможно
источник

IZ

Ilia Zviagin in pro.cxx
Sergey Anisimov
Здравствуйте, господа.
Архитектура вынуждает осуществить явное приведение типов вида
B* C::* -> D* C::* при условии, что B - невиртуальный предок D, а приводимое значение в действительности указывает на поле C типа D* (т.е., по сути, обычный Base* to Derived*, однако, с сохранением информации о том, что сам указатель хранится в поле произвольного C). static_cast и dynamic_cast такого функционала не предоставляет, reinterpret_cast слишком либерален, т.к. готов, согласно 7.6.1.10/10 осуществлять любые приведения вида T1 C1::* -> T2 C2::*, где T1 и T2 либо оба объекты, либо функции. Я что-то упускаю, кроме того факта, что наличие таких приведений в архитектуре в принципе нежелательно?
Ещё ты упускаешь что указатели на члены -это не указатели
источник

SA

Sergey Anisimov in pro.cxx
Не упускаю, вроде. Вопрос был лишь в том, как указать компилятору на то, что в действительности по смещению лежит указатель на Derived, а не (topmost) Base. Т.е. никаких операций со значениями выполнять бы не требовалось, а только разрешить использовать интерфейс соответствующего класса.
источник

SA

Sergey Anisimov in pro.cxx
Омойб-г, достаточно было static_cast<Derived*>((c.*member))...
источник

IZ

Ilia Zviagin in pro.cxx
Dmitriy
Как синхронизировать удаление объекта?
Дано: некий объект с двумя методами (назовем их Read() и Write()), работает в агрессивной многопоточной среде, сами методы lock-free
Задача: синхронизировать уничтожение - если объект еще читается или пишется, ждать окончания операций
Гарантируется, что новых обращений не будет, речь о "задолженностях"
Идея лочить shared_mutex в методах и деструкторе кажется крайне сомнительной
Мьютекс тут вообще ни при чем...
источник

IZ

Ilia Zviagin in pro.cxx
Dmitriy
Как синхронизировать удаление объекта?
Дано: некий объект с двумя методами (назовем их Read() и Write()), работает в агрессивной многопоточной среде, сами методы lock-free
Задача: синхронизировать уничтожение - если объект еще читается или пишется, ждать окончания операций
Гарантируется, что новых обращений не будет, речь о "задолженностях"
Идея лочить shared_mutex в методах и деструкторе кажется крайне сомнительной
Это надо архитектурой приложения решать, только так. Кто-то должен контролировать работу и удаление этого объекта.
Видимо кто-то, кто загружает его работой
источник

IZ

Ilia Zviagin in pro.cxx
Sergey Anisimov
Не упускаю, вроде. Вопрос был лишь в том, как указать компилятору на то, что в действительности по смещению лежит указатель на Derived, а не (topmost) Base. Т.е. никаких операций со значениями выполнять бы не требовалось, а только разрешить использовать интерфейс соответствующего класса.
Ты вообще в курсе, что указатели на члены разных классов друг к другу не приводятся?
источник

SA

Sergey Anisimov in pro.cxx
В примере нет указателей на члены разных классов.
источник

IZ

Ilia Zviagin in pro.cxx
Sergey Anisimov
В примере нет указателей на члены разных классов.
Как это?
источник

IZ

Ilia Zviagin in pro.cxx
Sergey Anisimov
Здравствуйте, господа.
Архитектура вынуждает осуществить явное приведение типов вида
B* C::* -> D* C::* при условии, что B - невиртуальный предок D, а приводимое значение в действительности указывает на поле C типа D* (т.е., по сути, обычный Base* to Derived*, однако, с сохранением информации о том, что сам указатель хранится в поле произвольного C). static_cast и dynamic_cast такого функционала не предоставляет, reinterpret_cast слишком либерален, т.к. готов, согласно 7.6.1.10/10 осуществлять любые приведения вида T1 C1::* -> T2 C2::*, где T1 и T2 либо оба объекты, либо функции. Я что-то упускаю, кроме того факта, что наличие таких приведений в архитектуре в принципе нежелательно?
Вот это вот B C D C это что?
Хотя да, ты не сильно понятно написал
источник

SA

Sergey Anisimov in pro.cxx
`B* C::* -> D* C::*`
Я вот здесь, по сути, всю задачу описал. И да, указатели на члены разных классов приводятся через reinterpret_cast. Зачем-то. Проблема в том, что я изначально отказался подумать и понять, что можно было результат индирекшена приводить, а не само смещение.
источник

P

Pavel in pro.cxx
Dmitriy
Там нет счетчиков. Там (почти) классическая очередь Майкла-Скотта
Ну если счетчики не используются - то можно либо их добавить (дешевле мьютекса все-таки), либо, как уже писал Ilia Zviagin, решать архитектурно.
источник

D

Dmitriy in pro.cxx
Ilia Zviagin
Это надо архитектурой приложения решать, только так. Кто-то должен контролировать работу и удаление этого объекта.
Видимо кто-то, кто загружает его работой
Это невозможно
источник

IZ

Ilia Zviagin in pro.cxx
Dmitriy
Это невозможно
Ну значит и задачу решить невозможно...
источник

П

Пашечка in pro.cxx
Dmitriy
Как синхронизировать удаление объекта?
Дано: некий объект с двумя методами (назовем их Read() и Write()), работает в агрессивной многопоточной среде, сами методы lock-free
Задача: синхронизировать уничтожение - если объект еще читается или пишется, ждать окончания операций
Гарантируется, что новых обращений не будет, речь о "задолженностях"
Идея лочить shared_mutex в методах и деструкторе кажется крайне сомнительной
Умный указатель со счетчиком ссылок прикрутить? При обнулении счетчика пусть дропает себя.
источник

C

Cole in pro.cxx
щас в коде увидел | оператор, как это нагуглить? не понимаю че это
источник

VS

Vladimir SHCHerba in pro.cxx
Cole
щас в коде увидел | оператор, как это нагуглить? не понимаю че это
источник