Rust 为Bindgen生成的指针类型执行Impl发送

Rust 为Bindgen生成的指针类型执行Impl发送,rust,ffi,Rust,Ffi,我正在尝试将FFI指针类型发送到另一个线程。它指向的结构已由bindgen生成 这是我的包装结构: pub struct AndroidAudioIO { sl_output_buffer_queue: NonNull<SLObjectItf>, } unsafe impl Send for AndroidAudioIO{} 我尝试为SLObjectItf{}添加不安全的impl-Send和其他变体,但没有成功 错误[E0277]:`std::ptr::NonNull`无法

我正在尝试将FFI指针类型发送到另一个线程。它指向的结构已由bindgen生成

这是我的包装结构:

pub struct AndroidAudioIO {
    sl_output_buffer_queue: NonNull<SLObjectItf>,
}
unsafe impl Send for AndroidAudioIO{}
我尝试为SLObjectItf{}添加
不安全的impl-Send
和其他变体,但没有成功

错误[E0277]:`std::ptr::NonNull`无法在线程之间安全共享
-->src/lib.rs:12:1
|
12 |/懒惰|静态!{
13 | |静态参考引擎:选项=无;
14 | | }
|| ^`std::ptr::NonNull`无法在线程之间安全共享
|
=帮助:在'audio::AndroidAudio'中,特性'std::marker::Sync'没有为'std::ptr::NonNull'实现`
=注意:必需,因为它出现在类型“audio::AndroidAudio”中`

我只关心
Send
而不关心
Sync
的原因是一个线程(RT音频线程)与这个结构交互,但它是在另一个线程上创建的,因此需要
将指针发送到正确的线程。

下面的代码重现了同样的问题(假设
Engine
仅在类型级别保留
AndroidAudioIO
,以便它可以在以后生成这样的处理程序;它也通过直接合成工作)

在这种情况下,
Engine
可以进行
Sync
(尽管
PhantomData
选择了避免对内部类型进行假设的安全行为)。要解决这个问题,首先要绝对确保
Engine
是线程安全的。然后,手动为这个引擎实现
Sync

unsafe impl<T> Sync for Engine<T> {}
引擎{}的不安全impl同步

我尝试为SLObjectItf{}添加
不安全的impl-Send
和其他变体,但没有成功


嗯,那通常是个坏主意™ 无论如何,实现
Send
和/或
Sync
应该在绑定的安全、高级抽象之上完成。

下面的代码重现了同样的问题(假设
Engine
仅在类型级别保留
AndroidAudioIO
,以便它可以在以后生成这样的处理程序;它也通过直接合成工作)

在这种情况下,
Engine
可以进行
Sync
(尽管
PhantomData
选择了避免对内部类型进行假设的安全行为)。要解决这个问题,首先要绝对确保
Engine
是线程安全的。然后,手动为这个引擎实现
Sync

unsafe impl<T> Sync for Engine<T> {}
引擎{}的不安全impl同步

我尝试为SLObjectItf{}添加
不安全的impl-Send
和其他变体,但没有成功


嗯,那通常是个坏主意™ 无论如何。实现
Send
和/或
Sync
应该在绑定的安全、高级抽象之上完成。

请不要盲目地将
Send
和/或
Sync
实现到任何结构。指针不是出于某种原因而发送的。谁负责清理或同步资源?您可以使用de>Mutex
/
Arc
以获得
Send
Sync
。由于生成了
sdlobjecttf
,因此我必须建议您仅在高级API层上实现
Send
/
Sync
。您还可以将实现Send但不实现Sync的原因包括在问题中。还请包括重现问题所需的部分。特别是,编译器消息引用了此处未显示的代码的附加部分。您可能可以制作一个在中运行的最小示例。我已添加了仅发送的理由,当我今晚有权访问代码时,将在操场中重新创建复制。我只关心
Send
-但是编译器关心
Sync
特性'std::marker::Sync'未实现
请不要盲目实现
发送
和/或
同步
到任何结构。指针不是出于某种原因发送的。谁负责清理或同步资源?您可以使用
互斥体
/
Arc
以获得
Send
Sync
。由于生成了
SDLObjectItf\uuuquot>,因此我必须建议您仅在高级API层上实现
Send
/
Sync
。您还可以将实现Send而非Sync的原因包括在问题中。请包括必要的部分s来重现问题。特别是,编译器消息引用了此处未显示的代码的附加部分。您可能可以制作一个在中运行的最小示例。我已添加了仅发送的推理,当我今晚有权访问代码时,将在操场重新创建一个复制。我只关心
发送
-但是编译器关心
Sync
特性'std::marker::Sync'未实现
我没有正确读取错误消息,并且混淆了
Send
Sync
。不幸的是,我没有正确读取错误消息,混淆了
Send
Sync
。不幸的是我
impl<T: ?Sized> Send for PhantomData<T>
where
    T: Send,
impl<T: ?Sized> Sync for PhantomData<T>
where
    T: Sync
unsafe impl<T> Sync for Engine<T> {}