Вызов arc_taker(arc.clone())
увеличивает счетчик ссылок, а возврат с arc_taker
снова уменьшает его. В этом случае это бесполезно, поскольку переменная arc
, равная main
, уже поддерживает Arc
в течение всего вызова. Ссылка на это уже будет достаточно. Нет необходимости увеличивать счетчик ссылок вверх и вниз.
В вашем конкретном примере arc_taker
даже не заботится о том, что им управляет Arc
. Все, что его волнует, это то, что существует от Mutex
до lock
, поэтому, чтобы сделать вашу функцию менее строгой, просто возьмите &Mutex<MyStruct>
.
Если вы хотите сделать с ней какие-либо специфичные для Arc
вещи, такие как получение weak_count
или чего-то еще, то взятие &Arc<..>
имело бы смысл. Если ваша функция будет хранить клон Дуги, только тогда будет иметь смысл взять значение Arc
, потому что тогда вызывающая сторона может решить дать вам дополнительную ссылку на нее, вызвав .clone()
(таким образом, счетчик ссылок), или чтобы дать вам право владеть собственным Arc
(и, следовательно, не увеличивать счетчик ссылок).