Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЕсли программа многопоточная... В С++ по умолчанию мало что потокобезопасное, об этом самому надо позаботиться std::atomic_...<std::shared_ptr> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:01 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCEMbТ.е. получается, что если мы возвращаем ссылку на shared_ptr, мы оставляем на совести вызывающего следить за тем, жив a в момент вызова Get() или нет. Ну ок, мне этот вариант больше нравится, спасибо всем :) Пойду переписывать код... Если программа многопоточная, то возврат ссылки (а не копии) создает точку, когда объект может быть уничтожен между возвратом и присвоением его в копию. Поэтому, если объект используется в нескольких потоках, то ссылки использовать нельзя (кроме случаев когда вы другими способами гарантируете время жизни объекта). Создание же копии смартуказателя это атомарная операция и гарантирует что другой поток не уничтожит объект. Перефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:05 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Dima TВ С++ по умолчанию мало что потокобезопасное, об этом самому надо позаботиться std::atomic_...<std::shared_ptr> Да не надо это. Вот так достаточно для большинства реальных программ. Код: plaintext 1. OoCcПерефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется. Нет. Не только. Даже внутри одного потока копирование указателя в ссылку может привести к UB при выходе из области видимости (как в данном случае с геттером). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:11 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyДаже внутри одного потока копирование указателя в ссылку может привести к UB при выходе из области видимости (как в данном случае с геттером). Ты имеешь ввиду это ? 20569695 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:16 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
CEMbсомнения меня гложут, как правильно делать? раньше, если я возвращал какую-то переменную класса геттером, я делал так: Код: plaintext 1. теперь, если у меня в классе переменная идёт, как shared_ptr<T>, то я и должен возвращать ровно shared_ptr<T>, чтобы создалась ещё одна копия, и счётчик таким образом увеличился на 1 вовсе нет, зависит от того, хочешь ли ты продлить время жизни объекта до того, как его не освободит ещё и Клиент твоего класса. Но это вовсе не обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:33 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDima TВ С++ по умолчанию мало что потокобезопасное, об этом самому надо позаботиться std::atomic_...<std::shared_ptr> Да не надо это. Вот так достаточно для большинства реальных программ. Код: plaintext 1. Как я понимаю тут происходит ++ внутреннего счетчика. Счетчик не атомарный. Если в это же время произойдет изменение этого же счетчика в другом потоке, то счетчик может перестать соответствовать реальному количеству указателей, т.е. в итоге или досрочное уничтожение объекта или утечка памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:55 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЕсли программа многопоточная, то возврат ссылки (а не копии) создает точку, когда объект может быть уничтожен между возвратом и присвоением его в копию. Поэтому, если объект используется в нескольких потоках, то ссылки использовать нельзя (кроме случаев когда вы другими способами гарантируете время жизни объекта). Создание же копии смартуказателя это атомарная операция и гарантирует что другой поток не уничтожит объект.Будет ли разрушен последний владеющий указатель до того, как будет создана его новая копия на стеке при передачи по значению или до того, как будет создана его новая копия в вызывающей программе при передаче по ссылке - не имеет значения . В любом случае, такие нюансы приходится тщательно программировать ручками через атомарные функции блокировки ресурса вплоть до передачи еще одного параметра, указывающего, освобождать ли ресурс сразу или удерживать до последующего обращения к нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 15:06 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
OoCcПерефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется.Да, не рекомендуется, если ничего не знаешь о volatile, барьерах компилятора и кэша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 15:09 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Dima TAnatoly Moskovskyпропущено... Да не надо это. Вот так достаточно для большинства реальных программ. Код: plaintext 1. Как я понимаю тут происходит ++ внутреннего счетчика. Счетчик не атомарный . Если в это же время произойдет изменение этого же счетчика в другом потоке, то счетчик может перестать соответствовать реальному количеству указателей, т.е. в итоге или досрочное уничтожение объекта или утечка памяти. В 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). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 16:03 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Вася УткинВ 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 точно потокобезопасный . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 16:19 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
rdb_devБудет ли разрушен последний владеющий указатель до того, как будет создана его новая копия на стеке при передачи по значению или до того, как будет создана его новая копия в вызывающей программе при передаче по ссылке - не имеет значения . Имеет значение. Просто вы не поняли в чем проблема )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 20:05 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
rdb_devOoCcПерефразирую. Передавать по ссылке в другой контекст исполнения не рекомендуется.Да, не рекомендуется, если ничего не знаешь о volatile, барьерах компилятора и кэша.А можно по этой теме тоже уточнить детальнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2017, 05:17 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
CEMb, конечно! Барьеры доступа к памяти в Linux Акцент сделан на Linux, но в действительности, основная информация подходит для всех платформ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2017, 09:08 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
CEMb, еще: Intel® 64 Architecture Memory Ordering White Paper А как же всё-таки работает многопоточность? Часть I: синхронизация А как же всё-таки работает многопоточность? Часть II: memory ordering ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2017, 09:31 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
YesSqlCEMb, передача по значению - есть передача по значению. И в случае с shared_ptr она может быть достаточно тяжёлой. из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2017, 19:52 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Ынтырпрайзыч(тм)из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций..это проблема, которую можно решить со стороны программиста. Ты же предлагаешь проблему, которую со стороны программиста решить нельзя. Есть люди, которым 3 инструкции (даже 1 инструкция) - это очень критично, при этом они умеют хорошо программировать, и дыр в коде у них нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 05:15 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Ынтырпрайзыч(тм)YesSqlCEMb, передача по значению - есть передача по значению. И в случае с shared_ptr она может быть достаточно тяжёлой. из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций.. Такие вот Ынтырпрайзыч(тм)-ники дотащили С++ до уровня Java. Задачи бывают разные. Для ынтырпрайз Си-эР-эМ вероятнее всего С/С++ неподходящий инструмент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 13:54 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Ынтырпрайзыч(тм)из-за таких вот страдальцев по производительности в ПО обнаруживаются бесконечные дыры. С/С++-жулики не там оптимизируют, они только писчу кибертеррористам дают. Страдайте дальше от лишних 3 инструкций..Не болтайте ерундой! Если вам в вашей программе не нужна хорошая оптимизация для максимальной производительности, никто не мешает использовать Java или Csharp, где контролируется каждый чих и не надо следить за удалением ненужных объектов. Это лишь означает, что не C/C++ - жулики, а вы выбрали неподходящий для себя инструмент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 14:02 |
|
||
|
shared_ptr как возвращаемый результат
|
|||
|---|---|---|---|
|
#18+
Это не отменяет того что в многопоточном коде ссылки на shared_ptr передавать опасно. Можно, но только если каким то образом гарантировать время жизни исходного указателя. Например передавать вложенным вызовам ссылку на свою локальную копию . Или передавать ссылку на глобальный экземпляр указателя который не меняется в ходе программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 14:08 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39474158&tid=2018140]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 279ms |

| 0 / 0 |
