关于*mut c_void的线程间共享的问题

💡 原文中文,约1400字,阅读约需4分钟。
📝

内容提要

作者在C的SDK库上包装Rust库时遇到线程安全问题,使用SafePointer包装device_t类型,但仍报错“*mut c_void cannot be shared between threads safely”。作者希望确保只有一个工作线程,并解决编译器对dev有效性的误判。

🎯

关键要点

  • 作者在C的SDK库上包装Rust库时遇到线程安全问题。
  • 使用SafePointer包装device_t类型,但仍报错“*mut c_void cannot be shared between threads safely”。
  • 希望确保只有一个工作线程,并解决编译器对dev有效性的误判。
  • 在Rust中定义了结构体Device,包含dev、rw_lock和rd_th。
  • 实现了start_receive函数,用于启动接收线程。
  • 使用Arc和Mutex来管理线程和锁。
  • 尝试通过SafePointer解决指针共享问题,但未能成功。
  • 需要找到绕过编译器对dev有效性检查的方法。

延伸问答

在Rust中如何包装C的SDK库以解决线程安全问题?

可以使用结构体Device来包装device_t类型,并使用Arc和Mutex来管理线程和锁。

为什么会出现“*mut c_void cannot be shared between threads safely”的错误?

这个错误是因为编译器无法确认*mut c_void在多个线程间的安全性,导致无法共享。

如何确保只有一个工作线程在Rust中运行?

可以通过使用Mutex来锁定资源,并在创建线程时确保不再对dev进行操作。

SafePointer在Rust中是如何使用的?

SafePointer是一个包装类型,用于处理指针的安全性,但在此案例中未能解决共享问题。

如何解决编译器对dev有效性的误判?

需要找到绕过编译器对dev有效性检查的方法,可能涉及使用unsafe代码或其他技巧。

在Rust中如何实现接收线程?

可以通过定义start_receive函数,并在其中使用thread::spawn来创建接收线程。

➡️

继续阅读