|
Гонки
Ситуация гонок возникает, когда два
или более потока пытаются получить доступ к общему ресурсу
и изменить его состояние. Рассмотрим следующий пример.
Пусть Поток 1 получил доступ к ресурсу и изменил его
в своих интересах; затем активизировался Поток 2 и модифицировал
этот же ресурс до завершения Потока 1. Поток 1 полагает,
что ресурс остался в том же состоянии, в каком был до
переключения. В зависимости от того, когда именно был
изменен ресурс, результаты могут варьироваться — иногда
код будет выполняться нормально, иногда нет. Программисты
не должны строить никаких гипотез относительно порядка
исполнения потоков, т. к. планировщик ОС может запускать
и останавливать их в любое время.
Inc(i) ;
if i = iSomething
then DoSomething;
Здесь i — глобальная переменная, доступная
из обоих потоков. Пусть два или более потоков исполняют
этот код одновременно. Поток 1 инкрементировал значение
переменной i и хочет проверить ее значение для выполнения
тех или иных условий. Но тут активизируется другой поток,
который еще увеличивает значение i. В результате первый
поток "проскакивает" мимо условия, которое,
казалось бы, должно было быть выполнено.
Возникновения как ситуаций гонок, так
и тупиков можно избежать, если использовать приемы,
обсуждаемые ниже.
|