Если я хочу передать ресурс, какой тип параметра мне выбрать? weak_ptr? или shared_ptr - PullRequest
1 голос
/ 28 июня 2019

Есть ресурс: "ааа", тип которого "ААА".«aaa» управляется shared_ptr, и мы можем получить его слабый_ptr с помощью функции:

std::weak_ptr<AAA> get_aaa_weakPtr();

Теперь код client_code хочет посетить «aaa» и передать «aaa» в его child_functions.Вот так:

void mainFunc(){

std::shared_ptr<AAA> sPtr = get_aaa_weakPtr().lock();
assert( sPtr );
// use sPtr
// ...

childFuncA( /* also_need_aaa */ );
childFuncB( /* also_need_aaa */ );
childFuncC( /* also_need_aaa */ );
}

какой тип параметра мне выбрать в child_functions?weak_ptr?или shared_ptr?

1 Ответ

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

В случае параллельного программирования, то есть childFuncX может быть асинхронным, вы должны передать слабый_птр и внутри функции проверить правильность указателя (с помощью weak_ptr :: lock ()) и обеспечить единый доступ к ресурсу с помощьюstd :: lock_guard для мьютекса, который в вашем случае может быть создан непосредственно в основной функции (или unique_lock в зависимости от ваших потребностей).Избегайте глобальных и статических изменений, чтобы избежать будущих проблем по мере развития программного обеспечения.

...