// TODO: попробуйте удалить 'move' и посмотреть что получится

children.push(thread::spawn(move || -> u32 {

// Вычислим промежуточную сумму этого сегмента:

let result = data_segment

// итерируемся по символам этого сегмента..

.chars()

// .. преобразуем текстовые символы в их числовые значения..

.map(|c| c.to_digit(10).expect("должно быть числом"))

// .. и суммируем получившийся итератор из чисел

.sum();

// `println!` блокирует стандартный вывод, так что чередования текста не происходит

println!("обработан сегмент {}, result={}", i, result);

// "return" не обязателен, так как Rust "язык выражений" и

// последнее выполненное выращение в каждом блоке автоматически становится значением этого блока.

result

}));

}

/*************************************************************************

* Фаза "Reduce"

*

* Собираем наши промежуточные значения и объединяем их в конечные результат

************************************************************************/

// собираем промежуточный результат каждого потока в новый вектор

let mut intermediate_sums = vec![];

for child in children {

// собираем возвращаемое значение каждого дочернего потока

let intermediate_sum = child.join().unwrap();

intermediate_sums.push(intermediate_sum);

}

// Объединяем все промежуточные суммы в одну конечную сумму.

//

// Мы используем "turbofish" `::<>` чтобы подсказать `sum()` тип.

//

// TODO: попробуйте без turbofish, явно указывая тип final_result

let final_result = intermediate_sums.iter().sum::();

println!("Финальная сумма: {}", final_result);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<p id="Назначения"><strong><a l:href="#Назначения">Назначения</a></strong></p>

Не стоит позволять числу наших потоков быть зависимом от введённых пользователем данных. Что если пользователь решит вставить много пробелов? Мы действительно хотим создать 2000 потоков? Измените программу так, чтобы данные разбивались на ограниченное число блоков, объявленных статической константой в начале программы.

<p id="Смотрите_также_67"><strong><a l:href="#Смотрите_также_67">Смотрите также:</a></strong></p>

   • Потоки

   • вектора и итераторы

   • замыкания, семантика передачи владения и перемещения (move) в замыканиях

   • деструктуризация при присвоениях

   • нотация turbofish в помощь механизму вывода типов

   • unwrap или expect

   • перечисления

<p id="Каналы"><strong><a l:href="#Каналы">Каналы</a></strong></p>

Rust предоставляет асинхронные каналы (channel) для взаимодействия между потоками. Каналы обеспечивают однонаправленную передачу информации между двумя конечными точками: отправителем (Sender) и получателем (Receiver).

Перейти на страницу:

Похожие книги