< 返回版块

zjhken 发表于 2023-10-19 22:04

Tags:async,trait,unsafe,pointer

下面这个例子的原意图是将这个异步方法存起来放进Vec中, 再在别的地方用unsafe恢复方法并运行. 因为方法都是编译期就知道大小的, 所以它的指针的地指应该是不变的, 内容也不变, 所以应该是安全的? 但是下面这个例子是编译不过的, 因为AsyncFn是Trait Object, 无法直接cast 成 *const ().

请问要怎么编写这段代码? (使用unsafe是故意的)


Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e825dc6483bcf5097389e4a33221d13f

评论区

写评论
asuper 2023-10-30 11:28

这玩法好复杂,核心问题是Out的类型可能要支持多个,导致必须使用Trait对象吧,遇到过类似的问题,后面解决的也不漂亮。

提一点浅见,Trait Object应该本来就不是指针,是栈上的对象吧,我觉得你可以用Box::Leak()试试

作者 zjhken 2023-10-20 22:30

搞不定, 他的case和我的case不一样, 他的生命周期是在外面用+号串起来, 我这个是在泛型的<>里面的, 搞不懂

--
👇
Bai-Jinlin: 你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html

作者 zjhken 2023-10-20 15:28

感谢!我晚上研究一下, 它的目标与我的似乎是一致的

--
👇
Bai-Jinlin: 你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html

Bai-Jinlin 2023-10-20 09:22

你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html

1 共 4 条评论, 1 页