Telegram Group & Telegram Channel
πŸ‘£ Π—Π°Π΄Π°Ρ‡Π°: "БСзопасная многопоточная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ Π² Rust"

πŸ“Œ УсловиС:

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ (`PriorityQueue`), которая:

- ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнты с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· push(value: T, priority: u32).
- ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнт с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· pop() -> Option<T>.
- Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚:
- Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π° Π΄ΠΎΠ»Π³ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΎΠΊΠΈ ΠΈΠ»ΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ).
- ΠžΡ‚Π΄Π°Ρ‡Ρƒ элСмСнтов Π² порядкС убывания ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°.
- Π’Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ массовых опСрациях.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ:

- МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Rust (`std::sync`, `std::collections`).
- НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΠΎΠ΄Π΅ tokio, crossbeam, rayon ΠΈ Π΄Ρ€.
- Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ (`Generic`), Ρ‚.Π΅. Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

---

β–ͺ️ Подсказки:

- Для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ хранСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ BinaryHeap ΠΈΠ· std::collections.
- Для обСспСчСния многопоточности ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Arc<Mutex<...>>.
- Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ:
- Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΡƒΡ‡ΠΈ Π½Π° нСсколько ΡˆΠ°Ρ€Π΄ΠΎΠ² (`sharding`),
- Использовании Ρ‚ΠΎΠ½ΠΊΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ измСнСния состояния.

---

β–ͺ️ Π§Ρ‚ΠΎ оцСниваСтся:

- Π£ΠΌΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ΠΌ (`ownership`) ΠΈ заимствованиСм (`borrowing`) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС.
- АккуратноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ (`Mutex`, `RwLock`).
- ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΠ΄ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ (минимизация Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ).
- Чистота ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.
- Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки (`PoisonError` ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°).

---

β–ͺ️ Π Π°Π·Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

ИдСя Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹:

- Основная структура β€” Arc<Mutex<BinaryHeap<...>>>.
- ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ push ΠΈ pop Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя (Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΎΠΊ Π½Π° минимальноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅).
- ΠŸΡ€ΠΈ push(value, priority):
- ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² структуру, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ord Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π±Ρ‹Π» Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅ΠΌ сортировки.
- ΠŸΡ€ΠΈ pop():
- ΠŸΡ€ΠΎΡΡ‚ΠΎ pop() ΠΈΠ· BinaryHeap.
- ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок:
- ΠŸΡ€ΠΈ ΠΎΡ‚Ρ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (`PoisonError`) бСзопасно Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ структуру ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²Ρ‹ΡˆΠ΅.

---

β–ͺ️ Мини-ΠΏΡ€ΠΈΠΌΠ΅Ρ€ структуры:


use std::collections::BinaryHeap;
use std::sync::{Arc, Mutex};

#[derive(Eq, PartialEq)]
struct Item<T> {
priority: u32,
value: T,
}

impl<T> Ord for Item<T> {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
other.priority.cmp(&self.priority) // ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ порядок для max-heap
}
}

impl<T> PartialOrd for Item<T> {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}

pub struct PriorityQueue<T> {
heap: Arc<Mutex<BinaryHeap<Item<T>>>>,
}

impl<T> PriorityQueue<T> {
pub fn new() -> Self {
PriorityQueue {
heap: Arc::new(Mutex::new(BinaryHeap::new())),
}
}

pub fn push(&self, value: T, priority: u32) {
let mut heap = self.heap.lock().unwrap();
heap.push(Item { priority, value });
}

pub fn pop(&self) -> Option<T> {
let mut heap = self.heap.lock().unwrap();
heap.pop().map(|item| item.value)
}
}


---

β–ͺ️ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ:

- ❗ НС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ PoisonError β€” Ссли ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ°Π½ΠΈΠΊΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅, вся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ "сломана".
- ❗ Долгая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ push ΠΈΠ»ΠΈ pop, особСнно ΠΏΡ€ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
- ❗ ВозмоТная Π³ΠΎΠ½ΠΊΠ° состояний, Ссли ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Mutex Ρ‡Π΅Ρ€Π΅Π· нСбСзопасный ΠΊΠΎΠ΄ (`unsafe`).

---

β–ͺ️ Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вопросы Π½Π° собСсСдовании:

- Как ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуру для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ² Π½Π° pop() (Ссли ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста β€” ΠΆΠ΄Π°Ρ‚ΡŒ максимум N миллисСкунд)?
- Как Π±Ρ‹ Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ "Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° нСсколько ΡˆΠ°Ρ€Π΄ΠΎΠ²" для сниТСния ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²?
- Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· Atomic ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹?

---

@rust_code
Please open Telegram to view this post
VIEW IN TELEGRAM



tg-me.com/rust_code/932
Create:
Last Update:

πŸ‘£ Π—Π°Π΄Π°Ρ‡Π°: "БСзопасная многопоточная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ Π² Rust"

πŸ“Œ УсловиС:

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ (`PriorityQueue`), которая:

- ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнты с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· push(value: T, priority: u32).
- ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнт с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· pop() -> Option<T>.
- Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚:
- Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π° Π΄ΠΎΠ»Π³ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΎΠΊΠΈ ΠΈΠ»ΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ).
- ΠžΡ‚Π΄Π°Ρ‡Ρƒ элСмСнтов Π² порядкС убывания ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°.
- Π’Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ массовых опСрациях.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ:

- МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Rust (`std::sync`, `std::collections`).
- НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΠΎΠ΄Π΅ tokio, crossbeam, rayon ΠΈ Π΄Ρ€.
- Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ (`Generic`), Ρ‚.Π΅. Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

---

β–ͺ️ Подсказки:

- Для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ хранСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ BinaryHeap ΠΈΠ· std::collections.
- Для обСспСчСния многопоточности ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Arc<Mutex<...>>.
- Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ:
- Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΡƒΡ‡ΠΈ Π½Π° нСсколько ΡˆΠ°Ρ€Π΄ΠΎΠ² (`sharding`),
- Использовании Ρ‚ΠΎΠ½ΠΊΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ измСнСния состояния.

---

β–ͺ️ Π§Ρ‚ΠΎ оцСниваСтся:

- Π£ΠΌΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ΠΌ (`ownership`) ΠΈ заимствованиСм (`borrowing`) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС.
- АккуратноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ (`Mutex`, `RwLock`).
- ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΠ΄ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ (минимизация Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ).
- Чистота ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.
- Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки (`PoisonError` ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°).

---

β–ͺ️ Π Π°Π·Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

ИдСя Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹:

- Основная структура β€” Arc<Mutex<BinaryHeap<...>>>.
- ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ push ΠΈ pop Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя (Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΎΠΊ Π½Π° минимальноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅).
- ΠŸΡ€ΠΈ push(value, priority):
- ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² структуру, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ord Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π±Ρ‹Π» Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅ΠΌ сортировки.
- ΠŸΡ€ΠΈ pop():
- ΠŸΡ€ΠΎΡΡ‚ΠΎ pop() ΠΈΠ· BinaryHeap.
- ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок:
- ΠŸΡ€ΠΈ ΠΎΡ‚Ρ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (`PoisonError`) бСзопасно Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ структуру ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²Ρ‹ΡˆΠ΅.

---

β–ͺ️ Мини-ΠΏΡ€ΠΈΠΌΠ΅Ρ€ структуры:


use std::collections::BinaryHeap;
use std::sync::{Arc, Mutex};

#[derive(Eq, PartialEq)]
struct Item<T> {
priority: u32,
value: T,
}

impl<T> Ord for Item<T> {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
other.priority.cmp(&self.priority) // ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ порядок для max-heap
}
}

impl<T> PartialOrd for Item<T> {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}

pub struct PriorityQueue<T> {
heap: Arc<Mutex<BinaryHeap<Item<T>>>>,
}

impl<T> PriorityQueue<T> {
pub fn new() -> Self {
PriorityQueue {
heap: Arc::new(Mutex::new(BinaryHeap::new())),
}
}

pub fn push(&self, value: T, priority: u32) {
let mut heap = self.heap.lock().unwrap();
heap.push(Item { priority, value });
}

pub fn pop(&self) -> Option<T> {
let mut heap = self.heap.lock().unwrap();
heap.pop().map(|item| item.value)
}
}


---

β–ͺ️ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ:

- ❗ НС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ PoisonError β€” Ссли ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ°Π½ΠΈΠΊΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅, вся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ "сломана".
- ❗ Долгая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ push ΠΈΠ»ΠΈ pop, особСнно ΠΏΡ€ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
- ❗ ВозмоТная Π³ΠΎΠ½ΠΊΠ° состояний, Ссли ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Mutex Ρ‡Π΅Ρ€Π΅Π· нСбСзопасный ΠΊΠΎΠ΄ (`unsafe`).

---

β–ͺ️ Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вопросы Π½Π° собСсСдовании:

- Как ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуру для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ² Π½Π° pop() (Ссли ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста β€” ΠΆΠ΄Π°Ρ‚ΡŒ максимум N миллисСкунд)?
- Как Π±Ρ‹ Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ "Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° нСсколько ΡˆΠ°Ρ€Π΄ΠΎΠ²" для сниТСния ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²?
- Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· Atomic ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹?

---

@rust_code

BY Rust


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/rust_code/932

View MORE
Open in Telegram


Rust Telegram | DID YOU KNOW?

Date: |

Pinterest (PINS) Stock Sinks As Market Gains

Pinterest (PINS) closed at $71.75 in the latest trading session, marking a -0.18% move from the prior day. This change lagged the S&P 500's daily gain of 0.1%. Meanwhile, the Dow gained 0.9%, and the Nasdaq, a tech-heavy index, lost 0.59%. Heading into today, shares of the digital pinboard and shopping tool company had lost 17.41% over the past month, lagging the Computer and Technology sector's loss of 5.38% and the S&P 500's gain of 0.71% in that time. Investors will be hoping for strength from PINS as it approaches its next earnings release. The company is expected to report EPS of $0.07, up 170% from the prior-year quarter. Our most recent consensus estimate is calling for quarterly revenue of $467.87 million, up 72.05% from the year-ago period.

Mr. Durov launched Telegram in late 2013 with his brother, Nikolai, just months before he was pushed out of VK, the Russian social-media platform he founded. Mr. Durov pitched his new appβ€”funded with the proceeds from the VK saleβ€”less as a business than as a way for people to send messages while avoiding government surveillance and censorship.

Rust from br


Telegram Rust
FROM USA