6个版本
0.1.5 | 2022年12月22日 |
---|---|
0.1.4 | 2022年6月25日 |
0.1.1 | 2022年3月28日 |
#29 在 #single-threaded
每月125次下载
8KB
143 行
此库现已弃用。请考虑使用其他替代品,例如 tokio::sync::Mutex。
wasm_mutex
wasm_mutex::Mutex
专门用于单线程WebAssembly应用。类似于std::sync::Mutex
,数据可以通过lock
或try_lock
访问,这保证了数据只有在互斥锁锁定时才能被访问。
存储在RefCell<T>
中的数据在多个闭包尝试同时访问同一数据时(例如,一个点击事件处理程序和一个set interval处理程序)会遇到BorrowError
或BorrowMutError
。同样,在相同情况下,由于在当前线程已经持有锁的情况下调用锁,std::sync::Mutex
将会panic。wasm_mutex::Mutex
允许数据被锁定和解锁,从而在任何给定时间允许对数据进行单次访问。
示例用法
use std::rc::Rc;
use wasm_bindgen::prelude::*;
use wasm_mutex::Mutex;
use wasm_bindgen_futures::spawn_local;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = console)]
fn log(s: &str);
#[wasm_bindgen(js_name = setInterval)]
fn set_interval(closure: &Closure<dyn FnMut()>, millis: u32) -> i32;
}
#[wasm_bindgen(start)]
pub async fn main() -> std::result::Result<(), JsValue> {
let count = Rc::new(Mutex::new(0));
{
let locked_count = count.lock().await;
log(&format!("Starting count: {}", *locked_count));
}
let c = count.clone();
let increment = Closure::wrap(Box::new(move || {
let c = c.clone();
spawn_local(async move {
// wait for lock to be released before incrementing value
let mut locked_count = c.lock().await;
*locked_count += 1;
});
}) as Box<dyn FnMut()>);
let c = count.clone();
let print_count = Closure::wrap(Box::new(move || {
// if data is unlocked, lock and print current count value
if let Some(locked_count) = c.try_lock() {
log(&format!("Current count: {}", *locked_count));
}
}) as Box<dyn FnMut()>);
set_interval(&increment, 1000);
set_interval(&print_count, 3000);
increment.forget();
print_count.forget();
Ok(())
}
依赖关系
~110–345KB