6个版本

0.1.5 2022年12月22日
0.1.4 2022年6月25日
0.1.1 2022年3月28日

#29#single-threaded

Download history 18/week @ 2024-03-10 14/week @ 2024-03-17 2/week @ 2024-03-24 28/week @ 2024-03-31 2/week @ 2024-04-07 6/week @ 2024-04-14 26/week @ 2024-04-21 4/week @ 2024-04-28 1/week @ 2024-05-12 2/week @ 2024-05-26

每月125次下载

MIT 许可证

8KB
143

此库现已弃用。请考虑使用其他替代品,例如 tokio::sync::Mutex

wasm_mutex

wasm_mutex::Mutex专门用于单线程WebAssembly应用。类似于std::sync::Mutex,数据可以通过locktry_lock访问,这保证了数据只有在互斥锁锁定时才能被访问。

存储在RefCell<T>中的数据在多个闭包尝试同时访问同一数据时(例如,一个点击事件处理程序和一个set interval处理程序)会遇到BorrowErrorBorrowMutError。同样,在相同情况下,由于在当前线程已经持有锁的情况下调用锁,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