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

5

我正在尝试为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(());

我认为如果不使用不安全的代码是不可能的。你应该传递锁,它是“同步+发送”的,所以你不会有任何问题。 - snf
1个回答

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 频道中的 arrrrrrr1,他指导我找到了正确的方向。


这个API似乎在变动中。更多信息请参见:https://github.com/rust-lang/rust/issues/19379 - emk
API似乎已被弃用,推荐使用lazy_static包。有没有关于如何使用它的示例? - nelsonjchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接