< 返回版块

lovelock 发表于 2023-06-15 11:26

Tags:指针

我有这样一个多线程读,单线程写的场景,使用了RWLock(标准库的和parking_lot都试过,效果差不多,这不是重点)。

let state = Arc::new(RwLock::new(MyStruct::new()));

当notify监听到文件变化时,重新初始化一个MyStruct,然后重新赋值给正在被其他线程共享的这个

let new_state = MyStruct::new();

*state.write() = new_state;

这个MyStruct其实是相当复杂的一个结构,我观测发现*state.write() = new_state;这行代码会执行500多ms,那么这个语句应该是把新对象的内存复制到这个变量中去了,我在想有没有办法改成引用的方式,只改变指针的指向而不拷贝内存?

另外一个延伸的问题是,文件改变一次,但notify会监听到两次事件。。。

希望有大神可以帮忙指点迷津,多谢!!!

评论区

写评论
elsejj 2023-06-19 06:38

*state.write() = new_state;

感觉 500ms 是 *state.write() 获取锁需要的时间,一个结构如果大到需要 500ms 来做复制,那它的得非常大,一般情况下创建这种结构都很难

asuper 2023-06-16 14:02
let state = Arc::new(RwLock::new(Box::new(MyStruct::new())));

let new_state = Box::new(MyStruct::new());

试试,相比原来的,只是封了一层Box,主要区别在于new_state现在分配在堆上,那么赋值的时候就只需要改个指针了

DDD 2023-06-15 15:05

Mutex里面再包一个Box?

mllcms 2023-06-15 12:55

notify会监听到两次事件这个问题我最近也遇到过,我用的两个 channel 做防抖

Bai-Jinlin 2023-06-15 12:52

那你搞成静态全局变量不就好了,你非要with_state走extractor又有什么意义呢

--
👇
lovelock: 这个我之前尝试过,但它不支持Clone,我这个是需要一组线程用它的读实例,一个线程用它的写实例,而且是要传如axum的handler里的,它限制了必须要有Clone

https://docs.rs/arc-swap/latest/arc_swap/docs/limitations/index.html#no-clone-implementation

--
👇
Bai-Jinlin: https://docs.rs/arc-swap/

作者 lovelock 2023-06-15 12:31

这个我之前尝试过,但它不支持Clone,我这个是需要一组线程用它的读实例,一个线程用它的写实例,而且是要传如axum的handler里的,它限制了必须要有Clone

https://docs.rs/arc-swap/latest/arc_swap/docs/limitations/index.html#no-clone-implementation

--
👇
Bai-Jinlin: https://docs.rs/arc-swap/

Bai-Jinlin 2023-06-15 12:16

https://docs.rs/arc-swap/

1 共 7 条评论, 1 页