【问题标题】:Synchronizing access to FFI calls in Rust (via a global RWLock?)在 Rust 中同步访问 FFI 调用(通过全局 RWLock?)
【发布时间】:2014-11-21 16:02:16
【问题描述】:

我正在尝试为 C FFI 库构建 Rust 包装器,但底层库有一些不是线程安全的函数。要访问这些函数,我需要某种全局锁来保护 C 库的状态。

有没有办法使用全局 std::sync::RWLock 或类似机制来控制对 C 库的访问?

各种明显的解决方案都失败了,因为 Rust 不允许使用非平凡的全局初始化器:

error: function calls in constants are limited to struct and enum constructors [E0015]
example.rs:18 static global_state_lock: RWLock<()> = RWLock::new(());

【问题讨论】:

  • 如果不使用不安全的代码,我认为这是不可能的。你应该通过锁,它是Sync+Send,所以你不会有任何问题。

标签: multithreading locking rust ffi


【解决方案1】:

这个问题可以使用sync::mutex::StaticMutex解决:

extern crate sync;
use sync::mutex::{StaticMutex, MUTEX_INIT};

static LIBRARY_LOCK: StaticMutex = MUTEX_INIT;

fn access_global_resource() {
    let _ = LIBRARY_LOCK.lock();
    unsafe { call_thread_unsafe_c_api(); }
}

非常感谢#rust 上的 arrrrrrr1,他为我指明了正确的方向。

【讨论】:

  • 这个 API 似乎在不断变化。欲了解更多信息,请参阅:github.com/rust-lang/rust/issues/19379
  • API 似乎已被弃用,取而代之的是 lazy_static crate。关于如何做到这一点的任何示例?
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2018-01-14
  • 2010-09-11
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多