我正在尝试在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"};
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~
答案 0 :(得分:4)
此处Sync
means "can be safely shared between tasks when aliased"。 Rust认为包含原始指针的类型默认情况下不能在线程之间共享,并且静态变量需要是可共享的。
如果您有理由相信您的类型确实可以在没有问题的线程之间共享,那么您可以向编译器断言您更了解:
unsafe impl Sync for MyStruct { }
如果您可以控制C库,我会鼓励提出结构需要是静态的要求 - 可能是围绕某种句柄设计库。