Concurrent Data Structures
Recipe | Crates | Categories |
---|---|---|
Bounded multi-producer multi-consumer queue | ||
dashmap | ||
flurry |
dashmap
Fast concurrent HashMap for Rust.
dashmap
⮳ is an implementation of a concurrent associative array / hashmap in Rust. dashmap
⮳ tries to be a direct replacement for RwLock<HashMap<K, V>>
.
use std::sync::Arc;
use std::thread;
use dashmap::DashMap;
fn main() {
// Create a shared DashMap with an Arc
let map: Arc<DashMap<&str, i32, _>> = Arc::new(DashMap::new());
// or use: DashMap::with_capacity(20)
// Create multiple threads
let mut threads = Vec::new();
for i in 0..4 {
let map_clone = map.clone();
let thread_id = i;
threads.push(thread::spawn(move || {
// Access and modify the map from each thread
match thread_id {
0 => {
map_clone.insert("key1", thread_id);
println!("Thread {} inserted key1", thread_id);
}
1 => {
map_clone.insert("key2", thread_id);
println!("Thread {} inserted key2", thread_id);
}
2 => match map_clone.get("key1") {
Some(value) => {
println!("Thread {} read key1: {}", thread_id, *value);
}
_ => {
println!("Thread {} couldn't find key1", thread_id);
}
},
3 => match map_clone.get_mut("key2") {
Some(mut value) => {
*value += 10;
println!(
"Thread {} incremented key2 value to {}",
thread_id, *value
);
}
_ => {
println!("Thread {} couldn't find key2", thread_id);
}
},
_ => panic!("Unknown thread ID"),
}
}));
}
// Wait for all threads to finish
for thread in threads {
thread.join().unwrap();
}
assert_eq!(map.remove("key1").unwrap().1, 0); // returns Option<(K, V)>
assert!(map.contains_key("key2"));
map.remove_if("key2", |_, val| *val == 11);
// Access the final state of the map from the main thread
println!("final count: {}", map.iter().count());
}
Bounded multi-producer multi-consumer queue
Concurrent queues.
use crossbeam_queue::ArrayQueue; fn main() { let q = ArrayQueue::new(2); assert_eq!(q.push('a'), Ok(())); assert_eq!(q.push('b'), Ok(())); assert_eq!(q.push('c'), Err('c')); assert_eq!(q.pop(), Some('a')); println!("{:?}", q.pop()); }
flurry
flurry
is particularly good for read-heavy workloads.
Refer to the comparative benchmarks of concurrent HashMaps⮳ as well.
fn main() {}
[concurrent_data_structures: add flurry example (P1)](https://github.com/john-cd/rust_howto/issues/258)