#map #arc #arc-mutex #mutex #lock #sync #locking

arc_map

Arc>的Map,简化了对单个成员的访问

4次发布

使用旧Rust 2015

0.1.3 2018年8月28日
0.1.2 2018年8月28日
0.1.1 2018年8月20日
0.1.0 2018年8月18日

#arc-mutex中的第12

每月30次下载

MIT许可证

9KB
151

ArcMap

Arc Map旨在允许HashMap中存储Arc>,这样在访问单个元素时无需锁定整个Map。

欢迎贡献

v0.1.3中的更改

将三个主要方法中的&mut self改为&self

v0.1.2中的更改

将主通道切换为SyncSender,以便在父级中进行同步


lib.rs:

ArcMap存在是为了使Map中的多个Mutex基于的元素可访问

而无需在访问一个元素时锁定整个HashMap。

相反,Map被隐藏在内部的一个线程中,该线程将根据请求返回可访问的元素。

与其在fn中限制访问,不如直接返回Arc看起来更简单。

尽管Map可能不包含所需的元素,并且由于线程发送/接收,get方法返回"Result,AMapErr>"

可以这样访问:(尽管通常用于更复杂的对象)

use arc_map::ArcMap;
let mut am = ArcMap::new();

//update by grabbing mutex  
am.insert(3,"hello".to_string());
{
    let p = am.get(3).unwrap(); //p is Arc<Mutex<String>>
    let mut s = p.lock().unwrap();
    s.push_str(" world");
}

//read by grabbing mutex 
{ 
    let p2 = am.get(3).unwrap();
    let s2 = p2.lock().unwrap();
    assert_eq!(*s2,"hello world".to_string());
}


am.insert(4,"goodbye".to_string());

//update in place (No need for scoping)
am.on_do(4,|mut s| (&mut s).push_str(" cruel world")).unwrap();

//get info out
let ls = am.on_do(4,|s| s.clone()).unwrap();

assert_eq!(&ls,"goodbye cruel world");

虽然可以使用传统的互斥锁来实现这一点,但这里的接口使用起来要简单得多。

无运行时依赖项