在Rust中同步对FFI调用的访问(通过全局RWLock?)

emk*_*emk 4 multithreading locking ffi rust

我正在尝试为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(());
Run Code Online (Sandbox Code Playgroud)

emk*_*emk 6

可以使用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(); }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢#rust的arrrrrr1,他指出了我正确的方向.