小编Ada*_*m R的帖子

是否需要同步构造函数中非线程安全集合的变异?

如果我决定使用非线程安全的集合并同步其访问权限,我是否需要同步构造函数中的任何变异?例如,在下面的代码中,我理解列表的引用对于构造后的所有线程都是可见的,因为它是最终的.但我不知道这是否构成安全发布,因为构造函数中的add不是同步的,而是在ArrayList的elementData数组中添加一个引用,这是非final的.

private final List<Object> list;

public ListInConstructor()
{
    list = new ArrayList<>();
    // synchronize here?
    list.add(new Object());
}

public void mutate()
{
    synchronized (list)
    {
        if (list.checkSomething())
        {
            list.mutateSomething();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java multithreading

16
推荐指数
3
解决办法
675
查看次数

如何释放在WebAssembly中公开的Rust代码分配的内存?

我有一个用Rust和wasm-bindgen编写的Web应用程序需要存储状态.状态存储如下:

lazy_static! {
    static ref ID_TO_DATA: Mutex<HashMap<u32, Data>> = Mutex::new(HashMap::new());
}

pub struct Data {
    pub coder_id: u16,
    pub bools: Vec<bool>,
    pub ints: Vec<i32>,
    pub strings: Vec<String>,
}
Run Code Online (Sandbox Code Playgroud)

我尝试以下方法删除数据并释放内存,并从中删除数据,HashMap并且不会报告错误:

#[wasm_bindgen]
pub fn remove_data(id: u32) {
    match ID_TO_DATA.lock().unwrap().remove(&id) {
        Some(data) => {
            std::mem::drop(data);
        }
        None => {}
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,浏览器选项卡使用的内存不会丢失(使用Chrome 67).我使用Windows的任务管理器,并观察相关进程/选项卡的内存增长到近2GB,然后在我的程序删除所有条目后,我等了一会儿,内存仍然接近2GB.

我也试过以下,但得到了这个错误: RuntimeError: memory access out of bounds

#[wasm_bindgen]
pub fn remove_data(id: u32) {
    match ID_TO_DATA.lock().unwrap().remove(&id) {
        Some(mut data) => {
            unsafe {
                std::ptr::drop_in_place(&mut data);
            }
        }
        None => …
Run Code Online (Sandbox Code Playgroud)

rust webassembly

14
推荐指数
1
解决办法
600
查看次数

使用 wasm-bindgen 时如何在 Rust 中存储全局状态?

我正在尝试用 Rust 编写一个数据存储,它跨 wasm-bindgen 边界从 JavaScript 接收对象并存储它们以供以后检索。这是我希望的简化版本:

static mut MAP: HashMap<i32, String> = HashMap::new();

#[wasm_bindgen]
pub fn add_value(index: i32, value: String) {
    unsafe {
        MAP.insert(index, value);
    }
}

#[wasm_bindgen]
pub fn get_value(index: i32) -> String {
    unsafe {
        (*MAP.get(&index).unwrap()).clone()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我从 Rust 编译器得到这个错误:

static mut MAP: HashMap<i32, String> = HashMap::new();

#[wasm_bindgen]
pub fn add_value(index: i32, value: String) {
    unsafe {
        MAP.insert(index, value);
    }
}

#[wasm_bindgen]
pub fn get_value(index: i32) -> String {
    unsafe {
        (*MAP.get(&index).unwrap()).clone()
    }
}
Run Code Online (Sandbox Code Playgroud)

如何存储状态,以便跨 wasm-bindgen …

rust

8
推荐指数
0
解决办法
4438
查看次数

是否可以让 wasm-bindgen 忽略 impl 中的某些公共函数?

是否可以让 wasm-bindgen 忽略(不生成绑定)impl 中的某些公共函数?我有一个 impl,我希望某些公共函数具有绑定,但其他公共函数我不需要绑定。

rust

6
推荐指数
1
解决办法
439
查看次数

标签 统计

rust ×3

java ×1

multithreading ×1

webassembly ×1