Shared_ptr и видимость памяти в c ++ - PullRequest
2 голосов
/ 20 июня 2019

Если вы выделите кучу объекта с shared_ptr в потоке A, скопируйте shared_ptr в другой поток без какой-либо синхронизации. Другой поток гарантированно видит полностью построенный объект?

int main(){
    auto sp = std::make_shared<int>(5);
    auto f=std::async(std::launch::async, [sp](){
    std::cout<<*sp;});
}

Гарантируется ли печать 5?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

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

Итак, ответ - да. Вы передаете по значению, следовательно, копию.

0 голосов
/ 21 июня 2019

Как уже указывал кто-то в комментарии, ваш конкретный сценарий выше (доступ к выделенному объекту кучи осуществляется через указатель, передаваемый вновь порожденному потоку через поток arg) покрывается ответом на этот вопрос .

Теперь для сценария, описанного в последующем вопросе (доступ к выделенному объекту кучи осуществляется в отдельном потоке через указатель, помещенный в очередь), рабочий поток гарантированно увидит '5'потому что очередь должна быть реализована потокобезопасным способом, при котором барьер памяти обеспечивает видимость значения, хранящегося в объекте кучи (в вашем случае мьютекс использует барьер памяти за сценой).

...