Я изучаю std::sync::Barrier в Rust.
Согласно документации метода wait():
pub fn wait(&self) -> BarrierWaitResult(отрывок)
Барьеры можно использовать повторно после того, как все потоки встретились один раз, и их можно использовать непрерывно.
Одиночный (произвольный) поток получит
BarrierWaitResult, который возвращаетtrueизBarrierWaitResult::is_leader()при возврате из этой функции, а все остальные потоки получат результат, который вернетfalseизBarrierWaitResult::is_leader().
У меня есть два вопроса:
Как выбирается лидер?
Если мы повторно используем барьер, всегда ли лидер, выбранный при первом использовании, будет выбран лидером и при втором использовании? (Насколько я проверял, это правда.) Редактировать: ответ — нет (игровая площадка).
@Damien_The_Unbeliever Цель этого вопроса состоит исключительно в том, как это работает «под капотом». На самом деле это не XY-проблема. Я начал читать исходный код сейчас...





Из реализации wait():
pub fn wait(&self) -> BarrierWaitResult {
let mut lock = self.lock.lock().unwrap();
let local_gen = lock.generation_id;
lock.count += 1;
if lock.count < self.num_threads {
let _guard =
self.cvar.wait_while(lock, |state| local_gen == state.generation_id).unwrap();
BarrierWaitResult(false)
} else {
lock.count = 0;
lock.generation_id = lock.generation_id.wrapping_add(1);
self.cvar.notify_all();
BarrierWaitResult(true)
}
}
похоже, что он ведет подсчет всех потоков. при встрече данного потока, если это последний поток, он станет лидером (BarrierWaitResult(true)), в противном случае он станет не лидером (BarrierWaitResult(false)).
«Последний тред, из которого wait() звонил» может подойти лучше, это означает, что лидером по-прежнему будет произвольный тред.
Это также отвечает на зачеркнутый вопрос в ФП; лидер обычно меняется каждый раз, когда мы повторно используем барьер.
Какой ответ вы ищете помимо задокументированного — он выбран произвольно. Если вы хотите или нуждаетесь в том, чтобы лидер обладал каким-то особым свойством, вы должны установить это после выбора. Если вы спрашиваете о какой-то конкретной цели, пожалуйста, опишите, какова эта цель.