我正在研究自引用结构,并且我了解如何使用同步/发送特征来强制安全免受竞争条件的影响,但 Pin 用例似乎没有得到很好的解释。 基本上,这段代码不会编译,因为
iter
不是发送:
fn main() {
let mut list : LinkedList<RefCell<String>> = LinkedList::new();
list.push_back(RefCell::new("foo".to_string()));
let iterator = list.iter();
thread::spawn(move || {
// Compiler error: iterator is not Send.
for item in iterator {
item.replace("qux".to_string());
}
}).join().unwrap();
}
是否有类似的代码无法编译,因为要移动的对象不是 Pin 或者 Pin 只是一个约定,告诉接收代码该对象以一致的状态发送?那里的示例似乎暗示着编译错误,但从未见过明显由于固定问题而生成的错误。
为了更好地重新表述问题: 违反发送要求会导致编译错误。 违反 Pin 合约是否有可能产生编译错误?我读过,移动需要固定但未固定的对象会导致错误,但我找不到一种方法来导致编译错误在对象被固定时消失。
好吧,我在官方异步文档中找到了它。
基本上,这是一个伪简约的编译错误示例,当注释从包含 _marker 的行中删除时。
use std::pin::Pin;
use std::marker::PhantomPinned;
#[derive(Debug)]
struct Test {
a: String,
// _marker: PhantomPinned, // remove comment for compilation error
}
impl Test {
fn new(txt: &str) -> Self {
Test {
a: String::from(txt),
// _marker: PhantomPinned, // remove comment for compilation error
}
}
}
pub fn main() {
let mut test1 = Test::new("test1");
let mut test1 = unsafe { Pin::new_unchecked(&mut test1) };
let mut test2 = Test::new("test2");
let mut test2 = unsafe { Pin::new_unchecked(&mut test2) };
// the following line won't compile
std::mem::swap(test1.get_mut(), test2.as_mut().get_mut());
}