Pointers 带原始指针的静态结构给出`core::marker::Sync`未实现…“;

Pointers 带原始指针的静态结构给出`core::marker::Sync`未实现…“;,pointers,rust,ffi,Pointers,Rust,Ffi,我试图在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::m

我试图在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"};
//                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
这里。Rust认为包含原始指针的类型在默认情况下不可在线程之间共享,并且静态变量需要可共享

如果您有理由相信您的类型确实可以在线程之间毫无问题地共享,那么您可以向编译器断言您更了解:

unsafe impl Sync for MyStruct { }
但是,如果您可以控制C库,我会鼓励您取消结构需要是静态的这一要求——也许可以围绕某种句柄来设计库。

这里。Rust认为包含原始指针的类型在默认情况下不可在线程之间共享,并且静态变量需要可共享

如果您有理由相信您的类型确实可以在线程之间毫无问题地共享,那么您可以向编译器断言您更了解:

unsafe impl Sync for MyStruct { }
但是,如果您可以控制C库,我会鼓励您取消结构必须是静态的要求——也许可以围绕某种句柄设计库