小编Cés*_*cón的帖子

如何在线程之间共享包含幻像指针的结构?

我有一个结构需要对类型进行泛型,但该类型实际上并未包含在结构中:它用于此结构的方法中,而不是用于结构本身。因此,该结构包括一个PhantomData成员:

pub struct Map<T> {
    filename: String,
    phantom: PhantomData<*const T>,
}
Run Code Online (Sandbox Code Playgroud)

幻像成员被定义为指针,因为该结构实际​​上并不拥有类型为 的数据T。这是根据以下文档中的std::marker::PhantomData建议:

添加 type 字段PhantomData<T>表示您的类型拥有 type 的数据T。这反过来意味着当您的类型被删除时,它可能会删除一个或多个 type 实例T。这与 Rust 编译器的 drop check 分析有关。

如果您的结构实际上不拥有 type 的数据T,则最好使用引用类型,例如PhantomData<&'a T>(理想情况下)或PhantomData<*const T>(如果没有生命周期适用),以免表明所有权。

所以指针在这里似乎是正确的选择。然而,这会导致结构不再是Sendor Sync,因为PhantomData只有Send并且Sync如果它的类型参数是,并且因为指针都不是,所以整个事情也不是。所以,像这样的代码

// Given a master_map of type Arc<Map<Region>> ...
let map = Arc::clone(&master_map);

thread::spawn(move || {
    map.do_stuff();
});
Run Code Online (Sandbox Code Playgroud)

即使没有移动Region值甚至指针也无法编译: …

generics thread-safety rust phantom-types

4
推荐指数
1
解决办法
585
查看次数

标签 统计

generics ×1

phantom-types ×1

rust ×1

thread-safety ×1