Проблемы из-за отсутствия синхронизации

В исходных кодах есть одно место, заслуживающее особого обсуждения:

Проблема параллельного доступа к данным

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

Для тех, кому это интересно знать, один временной интервал для гонок возникает между записью сигнатуры и записью маркера или данных в блок. Другой интервал существует между освобождением tfpblk->string и созданием новой строки с установкой правильной длины. Правильным решением было бы запретить чтение блока, выполнить изменение данных и разрешить чтение блока после завершения изменений. Но и в этом случае мы имеем интервал неопределенности между моментом, когда TFP видит блок разрешенным на чтение и моментом, когда мы запрещаем его чтение.

Эта проблема не была исправлена просто потому, что вероятность такого случая очень мала и это восстановимая ошибка. Она могла бы быть полностью исправлена включением в структуру серийных номеров начала и завершения обновления данных. Перед началом изменения данных поток повышает «начальный» номер. После завершения работы с данными поток повышает «конечный» номер. Улита командной строки читала бы структуру целиком и сравнивала серийные номера. Если они не совпадают, то тогда бы утилита делала задержку на некоторое время и пыталась прочесть данные опять. Если номера совпадают, тогда данные можно использовать без проблем — раз номера одинаковы, значит данные в этот момент не изменяются другим потоком.

РубрикиFAQ

Добавить комментарий