我正在尝试在 Rust 中创建一些将传递给 C 代码的静态数据结构。下面是一个无法编译的最小示例,我不知道在这种情况下错误意味着什么。所以问题是,为什么它会失败,我该如何解决?
pub struct MyStruct {
pub name: *const str,
}
static mystruct: MyStruct = MyStruct {name: "why!!!\0"};
// src/lib.rs:52:29: 52:56 error: the trait `core::marker::Sync` is not implemented for the type `*const str`
// src/lib.rs:52 static mystruct: MyStruct = MyStruct {name: "why!!!\0"};
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
在这里,Sync意思是“当有别名时可以在任务之间安全地共享”。Rust 认为包含原始指针的类型在默认情况下不可在线程之间共享,并且静态变量需要可共享。
如果您有理由相信您的类型确实可以在线程之间毫无问题地共享,那么您可以向编译器断言您更了解:
unsafe impl Sync for MyStruct { }
Run Code Online (Sandbox Code Playgroud)
但是,如果您可以控制 C 库,我会鼓励取消结构必须是静态的要求 - 也许围绕某种句柄设计库。