< 返回版块

whfuyn 发表于 2020-08-12 20:38

#[derive(Clone)]
struct S{
    v: Option<Arc<..>>,
}

v是一个要初始化的值。

本来S是用另一个Arc<RwLock<..>>包着的,用着没出问题,后来想把锁的粒度写得更细一点,就把外面那层去掉了。

于是在外面clone了个寂寞,调了一下午(头疼

评论区

写评论
Neutron3529 2020-08-14 03:14

学到了,谢谢:)


👇
whfuyn: 背景:为了避免引用在异步下各种生命周期还有Sync/Send之类的坑,我把类型里面性质不够好的(不Sync、不Send)用ArcRwLock/Mutex包起来,再#[derive(Clone)]。这样我的方法可以用self而不是&self&mut self,就不会遇到什么要求'static之类的问题。

这里的坑是这样的:我想要的是在对这个值初始化了以后,这个类型的所有clone出来的副本都能拿到这个初始化的值。但实际上,按Option<Arc<..>>这么写,它一开始是个Noneclone出来还是一个None,后面对其中一个副本写入Arc<..>其它副本根本不会得到更新。它应该这么写Arc<RwLock<Option<..>>>,然后还要注意,写入的时候不能s.v = Arc::new(..),而要s.v.write().await.replace(..)

--
👇
Nalleyer: 请问楼主有更详细的说明吗,没看懂坑在哪里

--
👇
Neutron3529: 话说这么写有什么问题吗?

作者 whfuyn 2020-08-13 21:34

背景:为了避免引用在异步下各种生命周期还有Sync/Send之类的坑,我把类型里面性质不够好的(不Sync、不Send)用ArcRwLock/Mutex包起来,再#[derive(Clone)]。这样我的方法可以用self而不是&self&mut self,就不会遇到什么要求'static之类的问题。

这里的坑是这样的:我想要的是在对这个值初始化了以后,这个类型的所有clone出来的副本都能拿到这个初始化的值。但实际上,按Option<Arc<..>>这么写,它一开始是个Noneclone出来还是一个None,后面对其中一个副本写入Arc<..>其它副本根本不会得到更新。它应该这么写Arc<RwLock<Option<..>>>,然后还要注意,写入的时候不能s.v = Arc::new(..),而要s.v.write().await.replace(..)

--
👇
Nalleyer: 请问楼主有更详细的说明吗,没看懂坑在哪里

--
👇
Neutron3529: 话说这么写有什么问题吗?

Nalleyer 2020-08-13 14:40

请问楼主有更详细的说明吗,没看懂坑在哪里

Neutron3529 2020-08-13 13:17

话说这么写有什么问题吗?

1 共 4 条评论, 1 页