powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / shared_ptr как возвращаемый результат
20 сообщений из 45, страница 2 из 2
shared_ptr как возвращаемый результат
    #39474128
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли программа многопоточная...
В С++ по умолчанию мало что потокобезопасное, об этом самому надо позаботиться std::atomic_...<std::shared_ptr>
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474131
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyCEMbТ.е. получается, что если мы возвращаем ссылку на shared_ptr, мы оставляем на совести вызывающего следить за тем, жив a в момент вызова Get() или нет.
Ну ок, мне этот вариант больше нравится, спасибо всем :)
Пойду переписывать код...
Если программа многопоточная, то возврат ссылки (а не копии) создает точку, когда объект может быть уничтожен между возвратом и присвоением его в копию.
Поэтому, если объект используется в нескольких потоках, то ссылки использовать нельзя (кроме случаев когда вы другими способами гарантируете время жизни объекта).
Создание же копии смартуказателя это атомарная операция и гарантирует что другой поток не уничтожит объект.
Перефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474132
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ С++ по умолчанию мало что потокобезопасное, об этом самому надо позаботиться std::atomic_...<std::shared_ptr>
Да не надо это.
Вот так достаточно для большинства реальных программ.
Код: plaintext
1.
auto copy_ptr = orig_ptr; 



OoCcПерефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется.
Нет. Не только. Даже внутри одного потока копирование указателя в ссылку может привести к UB при выходе из области видимости (как в данном случае с геттером).
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474136
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДаже внутри одного потока копирование указателя в ссылку может привести к UB при выходе из области видимости (как в данном случае с геттером).
Ты имеешь ввиду это ? 20569695 .
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474149
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbсомнения меня гложут, как правильно делать?

раньше, если я возвращал какую-то переменную класса геттером, я делал так:
Код: plaintext
1.
const T& A::Get() {...}


теперь, если у меня в классе переменная идёт, как shared_ptr<T>, то я и должен возвращать ровно shared_ptr<T>, чтобы создалась ещё одна копия, и счётчик таким образом увеличился на 1



вовсе нет, зависит от того, хочешь ли ты продлить время жизни объекта до того, как его не освободит ещё и Клиент твоего класса.
Но это вовсе не обязательно.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474158
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima TВ С++ по умолчанию мало что потокобезопасное, об этом самому надо позаботиться std::atomic_...<std::shared_ptr>
Да не надо это.
Вот так достаточно для большинства реальных программ.
Код: plaintext
1.
auto copy_ptr = orig_ptr; 


Как я понимаю тут происходит ++ внутреннего счетчика. Счетчик не атомарный. Если в это же время произойдет изменение этого же счетчика в другом потоке, то счетчик может перестать соответствовать реальному количеству указателей, т.е. в итоге или досрочное уничтожение объекта или утечка памяти.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474163
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли программа многопоточная, то возврат ссылки (а не копии) создает точку, когда объект может быть уничтожен между возвратом и присвоением его в копию.
Поэтому, если объект используется в нескольких потоках, то ссылки использовать нельзя (кроме случаев когда вы другими способами гарантируете время жизни объекта).
Создание же копии смартуказателя это атомарная операция и гарантирует что другой поток не уничтожит объект.Будет ли разрушен последний владеющий указатель до того, как будет создана его новая копия на стеке при передачи по значению или до того, как будет создана его новая копия в вызывающей программе при передаче по ссылке - не имеет значения . В любом случае, такие нюансы приходится тщательно программировать ручками через атомарные функции блокировки ресурса вплоть до передачи еще одного параметра, указывающего, освобождать ли ресурс сразу или удерживать до последующего обращения к нему.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474164
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcПерефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется.Да, не рекомендуется, если ничего не знаешь о volatile, барьерах компилятора и кэша.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474223
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TAnatoly Moskovskyпропущено...

Да не надо это.
Вот так достаточно для большинства реальных программ.
Код: plaintext
1.
auto copy_ptr = orig_ptr; 


Как я понимаю тут происходит ++ внутреннего счетчика. Счетчик не атомарный . Если в это же время произойдет изменение этого же счетчика в другом потоке, то счетчик может перестать соответствовать реальному количеству указателей, т.е. в итоге или досрочное уничтожение объекта или утечка памяти.
В shared_ptr<T> счетчик атомарный.
http://en.cppreference.com/w/cpp/memory/shared_ptr To satisfy thread safety requirements, the reference counters are typically incremented using an equivalent of std::atomic::fetch_add with std::memory_order_relaxed (decrementing requires stronger ordering to safely destroy the control block).
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474240
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинВ shared_ptr<T> счетчик атомарный.
http://en.cppreference.com/w/cpp/memory/shared_ptr To satisfy thread safety requirements, the reference counters are typically incremented using an equivalent of std::atomic::fetch_add with std::memory_order_relaxed (decrementing requires stronger ordering to safely destroy the control block).
Тогда проблемы нет.
В переводе забыли это упомянуть http://ru.cppreference.com/w/cpp/memory/shared_ptr
И тут тоже ни слова http://www.cplusplus.com/reference/memory/shared_ptr/?kw=shared_ptr

У MS точно потокобезопасный .
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474427
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devБудет ли разрушен последний владеющий указатель до того, как будет создана его новая копия на стеке при передачи по значению или до того, как будет создана его новая копия в вызывающей программе при передаче по ссылке - не имеет значения .
Имеет значение. Просто вы не поняли в чем проблема ))
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474530
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devOoCcПерефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется.Да, не рекомендуется, если ничего не знаешь о volatile, барьерах компилятора и кэша.А можно по этой теме тоже уточнить детальнее?
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474573
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb, конечно! Барьеры доступа к памяти в Linux
Акцент сделан на Linux, но в действительности, основная информация подходит для всех платформ.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39474593
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39477313
YesSqlCEMb,

передача по значению - есть передача по значению. И в случае с shared_ptr она может быть достаточно тяжёлой.

из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций..
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39477407
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ынтырпрайзыч(тм)из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций..это проблема, которую можно решить со стороны программиста. Ты же предлагаешь проблему, которую со стороны программиста решить нельзя. Есть люди, которым 3 инструкции (даже 1 инструкция) - это очень критично, при этом они умеют хорошо программировать, и дыр в коде у них нет.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39477687
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ынтырпрайзыч(тм)YesSqlCEMb,

передача по значению - есть передача по значению. И в случае с shared_ptr она может быть достаточно тяжёлой.

из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций..
Такие вот Ынтырпрайзыч(тм)-ники дотащили С++ до уровня Java.

Задачи бывают разные. Для ынтырпрайз Си-эР-эМ вероятнее всего С/С++ неподходящий инструмент.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39477700
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ынтырпрайзыч(тм)из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций..Не болтайте ерундой!
Если вам в вашей программе не нужна хорошая оптимизация для максимальной производительности, никто не мешает использовать Java или Csharp, где контролируется каждый чих и не надо следить за удалением ненужных объектов. Это лишь означает, что не C/C++ - жулики, а вы выбрали неподходящий для себя инструмент.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39477711
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не отменяет того что в многопоточном коде ссылки на shared_ptr передавать опасно.
Можно, но только если каким то образом гарантировать время жизни исходного указателя.
Например передавать вложенным вызовам ссылку на свою локальную копию .
Или передавать ссылку на глобальный экземпляр указателя который не меняется в ходе программы.
...
Рейтинг: 0 / 0
shared_ptr как возвращаемый результат
    #39478083
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто не отменяет того что в многопоточном коде ссылки на shared_ptr передавать опасно.Кстати, давайте раскроем эту тему подробнее?
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / shared_ptr как возвращаемый результат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]