Какие есть хорошие способы адаптировать этот Barrier
пример для обработки двух различий:
количество элементов заранее неизвестно (например, в случае разбиения большого файла на строки)
без отслеживания дескрипторов потока (например, без использования вектора
handles
в приведенном ниже примере). Мотивация заключается в том, что это добавляет дополнительные накладные расходы.
Пример кода:
use std::sync::{Arc, Barrier};
use std::thread;
let mut handles = Vec::with_capacity(10);
let barrier = Arc::new(Barrier::new(10));
for _ in 0..10 {
let c = barrier.clone();
handles.push(thread::spawn(move|| {
// do some work
c.wait();
}));
}
// Wait for other threads to finish.
for handle in handles {
handle.join().unwrap();
}
Фрагмент кода немного адаптирован из Barrier
docs.
Первое, что пришло мне в голову, это (если возможно) изменить внутреннее значение Barrier
; однако API не предоставляет изменяемый доступ к свойству num_threads
структуры Barrier
.
Другая идея заключалась бы в том, чтобы не использовать Barrier
и вместо этого писать пользовательскую логику с AtomicUsize
.
Я открыт для изучения самых эргономичных/идиоматических способов сделать это в Rust.