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

时间:2014-11-21 16:02:16

标签: multithreading locking rust ffi

我试图为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(());

1 个答案:

答案 0 :(得分: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(); }
}

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