#[derive(Clone)]
struct S{
v: Option<Arc<..>>,
}
v是一个要初始化的值。
本来S是用另一个Arc<RwLock<..>>
包着的,用着没出问题,后来想把锁的粒度写得更细一点,就把外面那层去掉了。
于是在外面clone了个寂寞,调了一下午(头疼
1
共 4 条评论, 1 页
#[derive(Clone)]
struct S{
v: Option<Arc<..>>,
}
v是一个要初始化的值。
本来S是用另一个Arc<RwLock<..>>
包着的,用着没出问题,后来想把锁的粒度写得更细一点,就把外面那层去掉了。
于是在外面clone了个寂寞,调了一下午(头疼
评论区
写评论学到了,谢谢:)
👇
whfuyn: 背景:为了避免引用在异步下各种生命周期还有
Sync
/Send
之类的坑,我把类型里面性质不够好的(不Sync
、不Send
)用Arc
加RwLock/Mutex
包起来,再#[derive(Clone)]
。这样我的方法可以用self
而不是&self
或&mut self
,就不会遇到什么要求'static
之类的问题。这里的坑是这样的:我想要的是在对这个值初始化了以后,这个类型的所有
clone
出来的副本都能拿到这个初始化的值。但实际上,按Option<Arc<..>>
这么写,它一开始是个None
,clone
出来还是一个None
,后面对其中一个副本写入Arc<..>
其它副本根本不会得到更新。它应该这么写Arc<RwLock<Option<..>>>
,然后还要注意,写入的时候不能s.v = Arc::new(..)
,而要s.v.write().await.replace(..)
。--
👇
Nalleyer: 请问楼主有更详细的说明吗,没看懂坑在哪里
--
👇
Neutron3529: 话说这么写有什么问题吗?
背景:为了避免引用在异步下各种生命周期还有
Sync
/Send
之类的坑,我把类型里面性质不够好的(不Sync
、不Send
)用Arc
加RwLock/Mutex
包起来,再#[derive(Clone)]
。这样我的方法可以用self
而不是&self
或&mut self
,就不会遇到什么要求'static
之类的问题。这里的坑是这样的:我想要的是在对这个值初始化了以后,这个类型的所有
clone
出来的副本都能拿到这个初始化的值。但实际上,按Option<Arc<..>>
这么写,它一开始是个None
,clone
出来还是一个None
,后面对其中一个副本写入Arc<..>
其它副本根本不会得到更新。它应该这么写Arc<RwLock<Option<..>>>
,然后还要注意,写入的时候不能s.v = Arc::new(..)
,而要s.v.write().await.replace(..)
。--
👇
Nalleyer: 请问楼主有更详细的说明吗,没看懂坑在哪里
--
👇
Neutron3529: 话说这么写有什么问题吗?
请问楼主有更详细的说明吗,没看懂坑在哪里
话说这么写有什么问题吗?