Пояснительная бригада: Data Race

Поясняет Паша Вавилин, наставник на курсе по Python:

Давайте представим, что у нас есть один грузовой автомобиль и мы хотим зарабатывать деньги на нем. Вроде всё неплохо, но иногда мы ложимся спать, а автомобиль простаивает зря, хотя мог бы приносить прибыль. 

Что же делать? Можно научить сына развозить грузы, пока мы отдыхаем. Класс! Теперь все при деле, автомобиль используется на все 100%, но клиенты стали жаловаться! Оказывается, клиентам стали часто приходить не те посылки. Или, например, мы должны были доставить клиенту большую сборную сцену для мероприятия за две поездки, но клиент вместо второй части сцены получил грузовик с акриловыми ваннами. Мероприятие удалось спасти, благо проблема была обнаружена довольно быстро. Но почему так произошло? Дело в том, что грузовик в нашем примере — это глобально-доступный ресурс (shareable resource) между вами и вашим сыном. Сын видит, что вы вышли из грузовика, значит можно его взять и везти груз по первой в стопке накладной. Так именно и работает совместный доступ к ресурсам в памяти компьютера между несколькими процессами. 

Но можно, например, забирать ключи от автомобиля до тех пор, пока вы не выполните всю текущую доставку, чтобы не случилось таких оказий. Можно сказать, что операция доставки атомарна (неделима). Но нужно быть уверенным, что это точно будет атомарно, а то вдруг у вашего сына есть дубликат и он очень хочет поработать. Конечно, есть много способов контролировать это, но суть в том, что использование параллельности — это не только решение первоначальной проблемы, но и новые проблемы.

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме