Повышение shared_ptr <XXX> ориентировано на многопотоковое исполнение?

Пожалуйста, попробуйте это.

SELECT 
   DISTINCT id,NAME
FROM
   tableName
32
задан Patrizio Bertoni 9 June 2016 в 09:43
поделиться

3 ответа

Из документации повышения:

shared_ptr объекты предлагают тот же уровень потокобезопасности как встроенные типы. A shared_ptr экземпляр может быть "считан" (получил доступ к использованию только операции константы), одновременно несколькими потоками. Отличающийся shared_ptr экземпляры могут быть "записаны в" (получил доступ к использующим изменяемым операциям такой как operator= или сброс) одновременно несколькими потоками (даже когда эти экземпляры являются копиями и совместно используют тот же подсчет ссылок внизу.)

Любые другие одновременные доступы приводят к неопределенному поведению.

Таким образом, Ваше использование не безопасно, так как оно использует одновременное чтение и запись m_res. Пример 3 в документации повышения также иллюстрирует это.

Необходимо использовать отдельное взаимное исключение, которое охраняет доступ к m_res в SetResource/GetResource.

31
ответ дан 27 November 2019 в 20:17
поделиться

boost::shared_ptr<> предлагает определенный уровень потокобезопасности. Подсчетом ссылок управляют ориентированным на многопотоковое исполнение способом (если Вы не настраиваете повышение для отключения поддержки поточной обработки).

Таким образом, можно скопировать a shared_ptr вокруг и ref_count сохраняется правильно. То, что Вы не можете сделать безопасно в нескольких потоках, изменяют фактическое shared_ptr сам экземпляр объекта от нескольких потоков (таких как вызов reset() на нем от нескольких потоков). Таким образом, Ваше использование не безопасно - Вы изменяете фактическое shared_ptr экземпляр в нескольких потоках - у Вас должна будет быть своя собственная защита.

В моем коде, shared_ptrобычно местные жители или параметры, переданные значением, таким образом, нет никакой проблемы. При получении их от одного потока до другого я обычно использую ориентированную на многопотоковое исполнение очередь.

Конечно, ни одно из этого не обращается к потокобезопасности доступа к объекту, на который указывают shared_ptr - это также ваше дело.

40
ответ дан 27 November 2019 в 20:17
поделиться

Add, ваш класс имеет условие Cyclic-references; shared_ptr m_Res не может быть членом CResourceBase. Вместо этого можно использовать weak_ptr.

-1
ответ дан 27 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: