2014-10-15 4 views
1

Использование библиотеки C JSON под Ubuntu (json-c/json.h). Мне нужно разбирать строки JSON на нескольких потоках POSIX. В настоящее время я использую метод json_tokener_parse() - этот многопоточный сейф или мне нужно использовать что-то еще?Является ли библиотека JSON C потокобезопасной?

Thnx

+2

[почему вы не можете задать вопрос напрямую?] (Http://groups.google.com/group/json-c) –

ответ

3

Я просмотрел код: 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() не будут иметь реального эффекта.

+1

Хороший улов. Разве библиотека C не выполняет эквивалент 'setlocale (LC_ALL,« C »)' при запуске? –

+1

Это можно исправить с помощью правильного использования 'newlocale' и' uselocale', но тот факт, что 'LC_NUMERIC' может испортить точку счисления для разбора и печати с плавающей запятой, - это огромный беспорядок, который трудно решить так, безопасным, портативным и эффективным. –

+0

@JonathanLeffler: ага, хорошо поймать и вас. Вы правы, что при запуске гарантируется, что «C» гарантированно будет локали. Я обновлю свой ответ, чтобы отразить это. –

Смежные вопросы