이런 종류의 이동 의미를 자동으로 얻고 큰 값을 Box
에 배치하여 (즉, 힙에 할당하여) 가벼운 이동을 얻습니다. 스레드의 해시 맵으로 (이이 개선 될 수 여러 가지 방법이 있어요) type ConcurrentHashMap<K, V> = Mutex<HashMap<K, V>>;
를 사용하여, 하나가있을 수 있습니다 : 그 코드가 글로벌 해시 맵을 달성하기 위해 lazy_static!
매크로를 사용
use std::collections::{HashMap, RingBuf};
use std::sync::Mutex;
type ConcurrentHashMap<K, V> = Mutex<HashMap<K, V>>;
lazy_static! {
pub static ref MAP: ConcurrentHashMap<String, RingBuf<String>> = {
Mutex::new(HashMap::new())
}
}
fn send(message: String, address: String) {
MAP.lock()
// find the place this message goes
.entry(address)
.get()
// create a new RingBuf if this address was empty
.unwrap_or_else(|v| v.insert(RingBuf::new()))
// add the message on the back
.push_back(message)
}
fn recv(address: &str) -> Option<String> {
MAP.lock()
.get_mut(address)
// pull the message off the front
.and_then(|buf| buf.pop_front())
}
을 (로컬 객체를 사용하는 것이 더 좋을 수 Arc<ConcurrentHashMap<...>
, fwiw, 전역 상태는 프로그램 동작에 대한 추론을 어렵게 만들 수 있기 때문에). 또한 RingBuf
을 큐로 사용하므로 메시지는 주어진 address
에 대해 뱅크 업합니다. 한 번에 하나의 메시지 만 지원하려는 경우 유형은 ConcurrentHashMap<String, String>
일 수 있으며 send
은 MAP.lock().insert(address, message)
이고 recv
은 MAP.lock().remove(address)
이 될 수 있습니다.
(NB.이 형식을 컴파일하지 않았으므로 유형이 정확하게 일치하지 않을 수 있습니다.)