0

我正在使用crossbeam-epochrust 编写无锁数据结构。crossbeam-epoch使用 aguard加载堆分配的原子指针。数据结构接口的一个示例是:

fn get(&self, index: IndexType, guard: &'guard Guard) -> Option<&'guard Value>

此方法需要guard与返回值的引用具有相同生命周期的 a。

现在,我想在不提供Guard. 例如:

struct ReturnType<'guard, Value> {
    guard: Guard,
    value: Option<&'guard Value>
}

impl<'guard, Value> MyDataStructure<Value> {
    fn my_get(&self, index: IndexType) -> ReturnType<'guard, Value> {
        let guard = pin();
        let value = self.get(index, &guard);
        ReturnType {
            guard: guard,
            value: value
        }
    }
}

但是编译器不允许我这样做。

我的问题是如何实现该方法my_get

4

1 回答 1

1

这个问题需要改进。您应该始终添加一个最小的可重现示例,并且您也没有显示编译器错误是什么。

无论如何,在您的代码中,您只是忘记指定生命周期应该链接到什么。如果守卫的寿命至少与 一样长self,那么您应该使用以下方式声明您的方法:

fn my_get<'guard>(&'guard self, index: IndexType) -> ReturnType<'guard, Value> {

&'guard self告诉编译器链接'guardself. 如果守卫的寿命应该比结构长,那么你必须移动Value或者如果你想共享参考使用Arc<Value>文档

于 2020-10-30T13:50:07.313 回答