Пока вы пишете строго последовательные программы (делайте A, затем B, затем C; закончите!), У вас не будет проблем с параллелизмом, а механизмы параллелизма языка остаются неактуальными.
Когда вы переходите от программных упражнений к реальным вещам, довольно скоро вы сталкиваетесь с проблемами, решение которых является многопоточностью (или любым другим вариантом параллелизма, который у вас есть).
Дело: Программы с графическим интерфейсом. Допустим, вы пишете редактор с проверкой орфографии. Вы хотите, чтобы программа проверки орфографии тихо работала в фоновом режиме, но вы хотите, чтобы графический интерфейс плавно принимал пользовательский ввод. Таким образом, вы выполняете эти два действия как отдельные потоки.
Случай: я недавно написал программу (для работы), которая собирает статистику из двух файлов журнала и записывает их в базу данных. Каждый файл занимает около 3 минут для обработки. Я переместил эти процессы в два потока, которые идут рядом, сократив общее время обработки с 6 минут до чуть более 3.
Case: Научное / инженерное программное обеспечение для моделирования. Существует множество проблем, которые решаются путем вычисления какого-либо эффекта (скажем, теплового потока) в каждой точке трехмерной сетки, представляющей вашего испытуемого (звездное ядро, ядерный взрыв, географическое распространение популяции насекомых ...). По сути, одни и те же вычисления выполняются в каждой точке и во многих точках, поэтому имеет смысл выполнять их параллельно.
Во всех этих случаях и во многих других случаях, когда два вычислительных процесса обращаются к одной и той же памяти (= переменным, если хотите) примерно в одно и то же время, существует вероятность того, что они будут мешать друг другу и мешать работе друг друга. Огромная ветвь информатики, которая занимается «параллельным программированием», занимается идеями о том, как решить эту проблему.
Достаточно полезное начальное обсуждение этой темы можно найти в Википедии .