Size: a a a

2021 July 08

D

Dmitriy in pro.cxx
К сожалению, shared_ptr уже используется в плюсовой части асинхронного кода, так что просто так "взять и выкинуть" не удастся без потери RAII
источник

U

UsernameAK in pro.cxx
выкинуть не надо
источник

U

UsernameAK in pro.cxx
повтори такой же, но с поддержкой этого
источник

U

UsernameAK in pro.cxx
или возьми из буста
источник

D

Dmitriy in pro.cxx
Ты хоть понял, что написал?)
Есть объекты, которые в асинхронном C++ коде шарятся с помощью shared_ptr (да еще и с pmr-аллокатором)
Как меня спасет boost::intrusive_ptr?
Переделок гораздо больше светит
источник

U

UsernameAK in pro.cxx
а, я недочитал тред)
источник

D

Dmitriy in pro.cxx
Си-код будет выполнять только асинхронную операцию, а уже затем вызывать мой коллбэк, передавая ему void*-контекст
В коллбэке shared_ptr нужен для контроля времени жизни объекта, который мог во всех других местах уже, возможно, уничтожен
источник

D

Dmitriy in pro.cxx
intrusive_ptr здесь вряд ли обойтись ещё и по той причине, что сам объект - на который хранится указатель в intrusive_ptr - тоже должен где-то жить...
источник

D

Dmitriy in pro.cxx
Нет, на Си - не придется
источник

D

Dmitriy in pro.cxx
Задача в данном конкретном случае состоит исключительно в пробросе контекста до плюсового коллбэка через Сишный (асинхронный) API
источник

SS

Sergey Skvortsov in pro.cxx
Можно им обойтись, хранить intrusive_ptr и передавать сырой указатель на объект; по сырому указателю можно получить обратно inrusive_ptr. Достаточно счетчик руками инкрементнуть при установке коллбека и декрементнуть в коллбеке (не обязательно)
источник

D

Dmitriy in pro.cxx
А кто будет удалять объект?)
источник

SS

Sergey Skvortsov in pro.cxx
Кто последний будет держать intrusive_ptr
источник

SS

Sergey Skvortsov in pro.cxx
Коллбек ровно так же сможет
источник

D

Dmitriy in pro.cxx
К сожалению, операция
ptr.decrease();
if(ptr.use_count() == 0) {
    delete context;
}

Не атомарна
источник

SS

Sergey Skvortsov in pro.cxx
Так это не так делается
источник

SS

Sergey Skvortsov in pro.cxx
Операция
if (counter_.fetch_sub(1) == 1) {
   Deleter{}(this);
}
Атомарна, это UnRef() в intrusve_ptr, который зовется в деструкторе
источник

D

Dmitriy in pro.cxx
Не согласен. Объект мог храниться *где-то*, и удерживать его удаление из хранилищ до окончания использования копий как минимум нерационально
источник

D

Dmitriy in pro.cxx
Таки да, но выше я говорил про аллокаторы... :(
источник

SS

Sergey Skvortsov in pro.cxx
А что с ними меняется?
источник