Это интересное использование shared_ptr
для обеспечения безопасности потоков.То, в порядке ли это, зависит от гарантий безопасности потока boost::shared_ptr
.В частности, устанавливает ли он какой-то забор или мембрану, чтобы вы гарантировали, что все записи в конструкторе и insert
функциях set
происходят до того, как какая-либо модификация значения указателя станет видимой.
Я могу найти no потокобезопасность гарантирует что бы то ни было в документации Boost для умных указателей.Это удивляет меня, так как я был уверен, что некоторые из них.Но быстрый взгляд на источники для 1.47.0 ничего не показывает, и любое использование boost::shared_ptr
в многопоточной среде завершится неудачей.(Может кто-нибудь указать мне, что мне не хватает. Я не могу поверить, что boost::shared_ptr
проигнорировал многопоточность.)
В любом случае, есть три возможности: вы не можете использовать общий указатель вВ многопоточной среде (что, похоже, имеет место), совместно используемый указатель обеспечивает собственную внутреннюю согласованность в многопоточной среде, но не устанавливает порядок относительно других объектов, или совместно используемый указатель устанавливает полное упорядочение.Только в последнем случае ваш код будет безопасным как есть.В первом случае вам понадобится какая-то форма блокировки вокруг всего, а во втором вам понадобятся какие-то ограждения или мембраны, чтобы убедиться, что необходимые записи действительно выполнены перед публикацией новой версии, и что они будутбыть увиденным, прежде чем пытаться прочитать.