목록개발 및 공부/설계 (6)
NeuroWhAI의 잡블로그
https://stjepang.github.io/2020/01/31/build-your-own-executor.html Build your own executor Now that we’ve built the block_on() function, it’s time to take one step further and turn it into a real executor. We want our executor to run not just one future at a time but many futures concurrently! stjepang.github.io spawn 함수를 만들고 여기에 future를 넘기면 적절하게 감싸고 큐에 올려 실제로 실행되게 합니다.
출처 : https://rust-lang.github.io/api-guidelines/future-proofing.html C++이나 C#에 보면 sealed라는 키워드가 있습니다. 이걸로 수식된 클래스는 상속의 끝을 뜻하며 자식 클래스를 가질 수 없죠. 보통 다른 개발자가 의도치 않게 자신의 클래스를 상속하고 확장하는 것을 방지하기 위한 용도로 쓰입니다. Rust에서도 이와 비슷한 목적으로 trait을 sealed 시킬 수 있습니다. 다만 키워드로 지원하는 것은 아니고 문법을 이용합니다. 다른 개발자가 trait을 사용할 수는 있어도 다른 타입에 impl하는 것은 막는 것이죠. pub trait Foo: private::Sealed { fn foo(&self); } impl Foo for usize {..
if self.cache.contains_key(ids) { let sub_cache = self.cache.get_mut(ids).unwrap(); if sub_cache.contains_key(page_id) { let data = sub_cache.get_mut(page_id).unwrap(); data.update(cnt); } else { // 캐시가 비정상적으로 커질 가능성 배제. if sub_cache.len() >= self.max_sub_cache_len { sub_cache.clear(); } sub_cache.insert(page_id.clone(), CacheData::new(cnt)); } } else { let mut sub_cache = HashMap::new(); sub_ca..
데코레이터 패턴으로 HTML 코드를 표현한 예제입니다. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b0fb18d31a6e4da32f135a3970985efc trait Element { fn outer_html(&self) -> String; } struct Content { content: String } impl Content { fn new(content: &str) -> Content { Content { content: content.into() } } } impl Element for Content { fn outer_html(&self) -> String { self.content.clone() } } st..
https://merry-christmas-wasm.herokuapp.com 확증은 없는데 경험적으로 보자면 원인은 잊혀진(?) 메모리의 재사용 때문이 아닐까 싶습니다.문제가 되는 시나리오는 아래와 같습니다.일단 캔버스에 쓸 메모리를 Rust에서 할당하고 forget합니다.눈을 계속 만들면서 Vec가 내부적으로 공간 확보를 위해 재할당을 수행하는데 이때 forget했던 메모리 부분을 침범합니다.캔버스 이미지가 제대로 나오지 않게 됩니다!그래서 임시로 눈을 담고 있는 Vec의 재할당이 일어나지 않게 하고 캔버스에 쓸 메모리를 할당하기 전에 초기 눈 생성을 수행했더니 제대로 동작을 했습니다.이것을 토대로 어차피 할당하는 메모리는 캔버스에 쓸 이미지 메모리 뿐이니 전용 static Vec을 만들고 forget..
가짜 공유란 캐시 코히런스 때문에 시스템이 실제로 공유되고 있지 않은 캐시 데이터를 동기화하는 행위 또는 그로 인해 발생하는 성능 하락을 말합니다. 얼마전 책에서 읽었는데 충격적인지라 기억에 남습니다. 그냥 바로 코드를 봅시다. (주의: 하드웨어 환경에 따라 결과가 상이할 수 있음) 코드 및 결과 : https://wandbox.org/permlink/Nr8F51OgbILBiIUw #include #include #include using namespace std; using int64 = long long int; constexpr int64 NUMBERS = 1000000000LL; volatile int64 num1 = 0; volatile int64 num2 = 0; void job1() { fo..