可以使用_control87
检查x87浮点控制字的值。当一个新线程启动时,在我的平台上,它似乎从父线程继承了浮点控制字的值。
这是未定义的行为,还是我保证,如果我启动一个新线程,并且线程库没有错误,控制字与父线程中的值相同?
在哪个标准中定义了这种行为,以及如何?如果未在任何标准中定义,是否在处理器手册或操作系统文档中定义了?
我正在使用C ++语言,在64位Windows 7上开发,编译32位Windows目标,并使用x86兼容处理器执行代码。我需要专门针对这个平台的答案,但如果所有语言和处理器的行为相同,那么通用答案会更好。
答案 0 :(得分:9)
C标准(ISO / IEC 9899:2011)在7.6第2段中有此声明:
浮点环境具有线程存储持续时间。线程浮点环境的初始状态是在创建时创建它的线程的浮点环境的当前状态。
C ++标准(ISO / IEC 14882:2014)在26.3.1 [cfenv.syn]第3段中有此声明:
浮点环境具有线程存储持续时间(3.7.2)。线程浮点环境的初始状态是构造相应线程的线程的浮点环境的状态 std :: thread对象(30.3.1)在构造对象时。
也就是说,C和C ++都指定浮点环境是从创建线程继承的。此浮点环境是任何控件世界的语言级别表示。但请注意,不支持支持浮点环境。例如,C的脚注12(在5.1.2.3中;突出显示是我的)暗示:
用于二进制浮点运算的IEC 60559标准要求某些用户可访问的状态标志和控制模式。浮点运算隐式设置状态标志;模式影响结果 浮点运算的值。 支持此类浮点状态的实现需要将其更改视为副作用 - 有关详细信息,请参阅附录F.