Значение управляющего слова с плавающей запятой x87 можно проверить с помощью _control87
, Когда начинается новый поток, на моей платформе он, кажется, наследует значение управляющего слова с плавающей запятой от родительского потока.
Это неопределенное поведение, или я гарантирую, что, если я запускаю новый поток, а в библиотеке потоков нет ошибок, контрольное слово имеет то же значение, что и в родительском потоке?
В каком стандарте это поведение определяется и как? Если он не определен ни в одном стандарте, определяется ли он в руководстве по процессору или в документации операционной системы?
Я использую язык C ++, разрабатываю для 64-битной Windows 7, компилирую для 32-битной цели Windows и выполняю код с x86-совместимым процессором. Мне нужен ответ специально для этой платформы, но если поведение будет одинаковым для всех языков и процессоров, тогда общий ответ будет лучше.
Стандарт C (ISO / IEC 9899: 2011) содержит следующее заявление в пункте 7.6:
Среда с плавающей точкой имеет длительность хранения потока. Начальным состоянием среды с плавающей точкой потока является текущее состояние среды с плавающей точкой потока, который создает его во время создания.
Стандарт C ++ (ISO / IEC 14882: 2014) содержит следующее утверждение в пункте 3 статьи 26.3.1 [cfenv.syn]:
Среда с плавающей точкой имеет длительность хранения потока (3.7.2). Начальное состояние для среды с плавающей точкой потока — это состояние среды с плавающей точкой потока, который создает соответствующий
объект std :: thread (30.3.1) во время создания объекта.
То есть и C, и C ++ указывают, что среда с плавающей запятой наследуется от потока создания. Эта среда с плавающей запятой представляет собой представление уровня языка любого контролировать мир. Обратите внимание, однако, что нет мандата на поддержку среды с плавающей запятой. На это намекает, например, сноска С 12 (в 5.1.2.3; выделение мое):
Стандарт IEC 60559 для двоичной арифметики с плавающей точкой требует определенных доступных для пользователя флагов состояния и режимов управления. Операции с плавающей точкой неявно устанавливают флаги состояния; режимы влияют на результат
значения операций с плавающей точкой. Реализации, которые поддерживают такое состояние с плавающей точкой должны рассматривать изменения к нему как побочные эффекты — подробности см. в приложении F.
Других решений пока нет …