Правительство: охраняет права и защищает правосудие. Департамент автомобильного транспорта: наш образец эффективности и равенства. Моя машина: новая модель и головная боль при парковке в Сан-Франциско.

Пока я сидел в зале Калифорнийского департамента автотранспорта я кое-что обдумывал. Например, почему я записался на встречу на 9 часов утра в понедельник, если дама за столом в регистратуре даже не потребовала никаких доказательств того, что я должен был стоять в очереди на экспресс обслуживание. Впрочем, все это не имеет значения, мне потребовалось всего 15 минут, чтобы войти, вручить свое домашнее задание и выйти. Но в департаменте не все так радужно.

Видите ли, пока я там сидел, ожидая, когда назовут мой номер, я кое-что заметил. Вот что случалось в этом конкретном отделении департамента: существует две регистратуры, одна для решения проблем с водительскими правами, другая для регистрации и остальных проблем. К ним подходят по две отгороженные дорожки, одна для тех, кто только что зашел, вторая для тех, кто притворяется, что им назначено. Вы подходите к столу, говорите диспетчеру, что вы пришли, она вручает вам необходимые формы и выдает номер. Потом вы садитесь на один из многочисленных стульев в многочисленных рядах и ждете, когда назовут ваш номер и он появится на мониторах. Монитор показывает, который из служащих готов вас обслужить.

Когда служащий готов кому-то помочь, что само по себе является небольшим чудом, он нажимает кнопку на своем рабочем месте. Раздается голос «Талон номер A005: Окно #23.» Затем на мониторах в списке из 10-12 последних записей появляется "A005@#23". Пока в один момент времени делается только один вызов, это работает как положено. Если одновременно нажать две кнопки, голос должен объявить оба вызова. В теории.

Проблема, которую я обнаружил, заключалась в том, что если голосовое объявление (которое занимало какое-то время) не успевало закончиться до того, как нажималась кнопка в другом окне, без запинки объявлялись все вызовы в списке, а затем повторялось первоначальное объявление. Сначала я думал, что мне просто показалось, но затем я заметил, что первоначальный вызов повторялся на мониторах дважды. Похоже, кто-то прогулял занятия по проблемам конкурентного доступа к данным.

Разумеется, кода у меня нет, поэтому я не смогу это доказать. Однако сегодняшнее задачка заключается в том, чтобы вы воспроизвели подобное поведение.

Ну и для начала у Стэнли есть небольшой совет для тех, у кого возникают трудности с синхронизацией, «Не пытайтесь решить проблему таким способом».

 

CRITICAL_SECTION cs;
EnterCriticalSection(&cs);
/* сюда существующий код */
LeaveCriticalSection(&cs);

 

Вот что он пишет, «Сегодня я получил письмо от сослуживца, который утверждал, что исправил редкую, но проблемную ошибку с повреждением данных в версии нашего продукта для Windows. Существует минимум две причины, почему этот код ничего не делает».

Оригинал:http://worsethanfailure.com/Articles/Race-and-Government.aspx
Перевод:Евгений Виговский