此bounty已结束。此问题的答案有资格获得+50声望奖励。赏金宽限期19小时后结束。Matt Joiner希望引起更多的注意这个问题。
我试图返回一个包含共享互斥体引用的结构:
struct Test<'a> {
mutex: Arc<Mutex<()>>,
guard: &'a MutexGuard<'a, ()>,
}
impl<'a> Test<'a> {
pub fn new() -> Self {
let mutex = Arc::new(Mutex::new(()));
let guard = &mutex.lock().unwrap();
Self {
mutex,
guard,
}
}
}
寿命似乎是正确的:互斥体至少在Test
的生存期内存在,因此MutexGuard
没有对互斥体的延迟引用。但是Rust会出错。如何向Rust解释mutex
字段的生存期足够长,可以让guard
正常工作?
cannot return value referencing local variable `mutex`
returns a value referencing data owned by the current function
顺便说一句,我试图创建一个“多互斥”-一组密钥互斥(如HashMap
),以阻止下载一个文件的名称是在散列表(因为它已经在下载)。
1条答案
按热度按时间tmb3ates1#
这是不可能的,而且你写的东西很可能不是你想做的。
互斥锁守卫的目标是在互斥锁被丢弃时将其解锁。如果你把一个生命周期的守卫绑定到互斥体本身,你就是说它永远不会被丢弃,因此互斥体将永远被锁定。
不管怎样,你为什么需要警卫的资料?通常你不会在意,你只是希望它保持锁,只要它被引用。
也许你想这么做?你需要更多的上下文来看看这是否正是你想做的:D
为什么你的代码不工作
实际上有两个问题
1.对未知堆栈空间的引用(segfault!)
1.互斥锁到底存储在哪里?在你的例子中,它位于函数new的堆栈框架上。然后将指向它的指针存储在结构中并返回它。通过返回,你也删除了堆栈,那么指针指向哪里呢?(segfault!)