Rust 为Bindgen生成的指针类型执行Impl发送
我正在尝试将FFI指针类型发送到另一个线程。它指向的结构已由bindgen生成 这是我的包装结构: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`无法
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> {}