Я просмотрел код: https://github.com/json-c/json-c/blob/master/json_tokener.c
Это, кажется поточно-за одним исключением:
#ifdef HAVE_SETLOCALE
char *oldlocale=NULL, *tmplocale;
tmplocale = setlocale(LC_NUMERIC, NULL);
if (tmplocale) oldlocale = strdup(tmplocale);
setlocale(LC_NUMERIC, "C");
#endif
Так что, если HAVE_SETLOCALE
определяется (и это, вероятно, будет) , Будет вызываться setlocale()
, и он установит общесистемный LC_NUMERIC
на номер "C"
. И, конечно же, это отменяет это в конце. Это вызовет проблемы, если ваш LC_NUMERIC
не является "C"
или совместимым языком в начале, потому что один поток будет «восстанавливать» вашу локаль, в то время как еще один может по-прежнему разбираться и ожидать, что локаль "C"
будет действовать.
К счастью, это гарантирует, что локаль будет "C"
при запуске программы, поэтому вам просто нужно, чтобы убедиться, что ни вы, ни любой другой библиотеки вы используете наборы LC_NUMERIC
(или LC_ALL
конечно) на местности, несовместимой с "C"
, Тогда вы могли бы перестроить библиотеку с HAVE_SETLOCALE
, если это не хотите, но это, вероятно, не имеет значения, так как его вызовы на setlocale()
не будут иметь реального эффекта.
[почему вы не можете задать вопрос напрямую?] (Http://groups.google.com/group/json-c) –