add fenv cache to task struct (#51288)
Fixes #51277, though we give no guarantee that it keeps working this
way, or that calling `setrounding_raw` won't lead to other undefined
behavior.
To give some examples:
```julia
julia> t = Base.Rounding.setrounding_raw(Float64, Base.Rounding.to_fenv(RoundDown)) do
Task(() -> println(rounding(Float64)))
end
Task (runnable) @0x000000010dff04c0
julia> rounding(Float64)
RoundingMode{:Nearest}()
julia> wait(schedule(t))
RoundingMode{:Down}() # currently gives RoundingMode{:Nearest}()
julia> rounding(Float64)
RoundingMode{:Nearest}()
julia> Base.Rounding.setrounding_raw(Float64, Base.Rounding.to_fenv(RoundDown)) do
Threads.@threads :static for i = 1:Threads.nthreads()
println(Threads.threadid() => rounding(Float64))
end
end
1 => RoundingMode{:Down}()
2 => RoundingMode{:Down}() # currently gives RoundingMode{:Nearest}()
4 => RoundingMode{:Down}() # currently gives RoundingMode{:Nearest}()
3 => RoundingMode{:Down}() # currently gives RoundingMode{:Nearest}()
```