Для конкретного случая getenv
это действительно не реентерабельно и не безопасно для потоков.Что касается того, почему Microsoft не просто заменяет его, вы не можете взять этот интерфейс и сделать его реентерабельным (вы можете почти сделать его «поточно-ориентированным» с локальным хранилищем потоков, но он все равно не будет реентерабельным).1003 * Даже если вы просто убрали getenv
, существует проблема, связанная с тем, что у вас есть переменная environ
, которая потребует серьезной поддержки на уровне компилятора, чтобы сделать поток безопасным, поскольку это всего лишь данные.
Действительно, использование переменных окружения для чего-либо, кроме «установки его перед запуском процесса или при запуске процесса и только чтения с него с этого момента», вероятно, закончится слезами, если у вас большеодна нить.setenv
и putenv
не имеют достаточно богатого интерфейса, чтобы выразить что-то вроде «установить этот набор переменных среды атомарно», а также getenv
не имеет способа выразить «читать этот набор переменных среды атомарно»,
_dupenv_s
несколько глупо, на мой взгляд, потому что, если использование этого внезапно сделает ваш код безопасным, это, вероятно, может быть сделано безопасным способом с getenv._dupenv_s
решает небольшую часть проблем с использованием переменных среды в многопоточном сценарии.