Имеет ли std :: tr1 :: shared_ptr взаимное исключение? - PullRequest
1 голос
/ 25 августа 2011

У меня есть класс, который содержит BYTE*, счетчик ссылок и CRITICAL_SECTION, который защищает их обоих от одновременного доступа.

Я хочу заменить все это на std::tr1::shared_ptr<BYTE>. MSDN говорит, что:

Несколько потоков могут одновременно считывать и записывать различные объекты shared_ptr, даже если объекты являются копиями, которые имеют общее владение.

Все звучит нормально, пока я не выясню, что CRITICAL_SECTION из класса используется вне его, чтобы «заблокировать» его и изменить его содержимое взаимоисключающим образом.Хорошо, это нарушает инкапсуляцию, я хочу это изменить.

Я знаю, shared_ptr гарантирует освобождение памяти, но гарантирует ли это взаимное исключение при записи в память?

1 Ответ

5 голосов
/ 25 августа 2011

Вам необходимо обеспечить правильный доступ к данным, на которые указывает std::tr1::shared_ptr.Эти данные ваши .Это имеет значение только для std::tr1::shared_ptr, когда пришло время удалить его.

Относительно самого объекта std::tr1::shared_ptr у вас есть следующие гарантии:

  • , которые вы можете безопасно прочитать из один и тот же экземпляр из нескольких потоков;
  • вы можете безопасно изменять различные экземпляры из shared_ptr из нескольких потоков, , даже если экземпляры являются копиями (использование одного и того же счетчика ссылок или чего-либо еще);

Любой другой одновременный доступ (например, одновременное чтение и запись к одному и тому же экземпляру ) является неопределенным поведением.

Также обратите внимание, что shared_ptr в новом стандарте C ++ 11 имеет специальный API для атомарного доступа.

...