igned int currentEvenValue;

Автор admin Четверг, 25 июня 2009 11:32

igned int currentEvenValue; // Использование unsigned предотвращает public: // потерю значимости. EvenGenerator() { currentEvenValue = 0: } ~EvenGenerator() { cout « “-EvenGenerator” « endl: } int nextValueО { ++currentEvenValue: // Опасный момент! ++currentEvenValue; return currentEvenValue: } }: int mainO { EvenChecker::test(); } ///:- Существует опасность того, что проверяющий программный поток вызовет nextValue() после первого, но до второго инкремента currentEvenValue (в точке, помеченной комментарием «Опасный момент!»). В результате будет получено неправильное (нечетное) значение. Чтобы доказать, что такое возможно, EvenChecker::test() создает группу объектов EvenChecker, которые постоянно читают выходные данные EvenGenerator и проверяют четность всех сгенерированных значений. Если среди них попадутся нечетные значения, программа выдает сообщение об ошибке и завершается. Вполне возможно, что проблема проявится лишь при очень большом количестве циклов EvenGenerator; все зависит от особенностей операционной системы и других деталей реализации. Чтобы это произошло гораздо скорее, поп


Комментарии закрыты.