В C ++ 11 стандартные потоки теперь являются поддерживаемой частью языка.Стандарт явно указывает, что вызовы setlocale () вводят гонки данных с другими вызовами setlocale () или вызовы функций, на которые влияет текущая локаль C, включая strtod ().Считается, что функция locale :: global () ведет себя так, как если бы она вызывала setlocale (), поэтому она также может вводить гонку данных (см. Ниже).
В Linux с glibc это MT-unsafe (const: locale env) чтобы потоки вызывали setlocale () одновременно с аргументом, отличным от NULL, и вызывали любую другую функцию, которая могла бы использовать глобальный языковой стандарт (гонка данных и, следовательно, неопределенное поведение в C11).Вместо этого предлагается использовать uselocale () , которая безопасна для MT и изменяет только локаль вызывающего потока.В Linux с libstdc ++ в коде C ++ вы должны избегать locale :: global (изменение процесса в целом) и создавать локаль для использования потока (locale :: global является MT-unsafe по тем же причинам, что и среда выполнения C).Учитывая вашу цель использовать strtod (C API), вы должны использовать uselocale ().
В Linux, использующем glibc, функция setlocale () сама по себе является MT-небезопасной, если вы не соответствуете 2 строгим критериям и в соответствии с требованиями POSIXменяет локаль для всего процесса.Новые справочные страницы Linux (часть Red Hat и Fujitsu работают над указанием нотаций MT-безопасности для всех API ) помечают setlocale () как "MT-Unsafe const: locale env", что означает, что setlocale является MT-безопасным IFF, вы сохраняете константу локали (не изменяя ее, просто запрашивая ее, передавая NULL), и если вы сохраняете константу локали и среды (чтобы избежать изменений в локали, если аргумент равен "«).В Linux, использующем glibc, вы должны использовать uselocale (), если вы хотите изменить только локаль вызывающего потока, поскольку это MT-безопасно и никак не зависит от вашей среды, а strtod будет использовать локаль потока.Точно так же все системы, которые реализуют POSIX, должны предоставлять uselocale () для использования в контексте потока (MT-safe).
OS X реализует uselocale (), так что вы можете использовать это.
При использовании Windows_configthreadlocale для изменения, если setlocale () работает со всем процессом или потоками (превращает его в uselocale, что вам нужно), но для кода C ++ вам снова нужно использовать экземпляр класса locale и избегать locale :: global .