我在 Ubuntu ( json-c/json.h ) 下使用 C JSON 库。我需要在多个 POSIX 线程上解析 JSON 字符串。目前正在使用 json_tokener_parse() 方法 - 这是多线程安全还是我需要使用其他东西?
谢谢
我在 Ubuntu ( json-c/json.h ) 下使用 C JSON 库。我需要在多个 POSIX 线程上解析 JSON 字符串。目前正在使用 json_tokener_parse() 方法 - 这是多线程安全还是我需要使用其他东西?
谢谢
我查看了代码: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
所以 ifHAVE_SETLOCALE
被定义(它可能会被定义),setlocale()
将被调用并将进程范围设置LC_NUMERIC
为"C"
. 当然,它最终会撤消这一点。如果您的LC_NUMERIC
is not"C"
或一开始的语言环境不兼容,这将导致问题,因为一个线程将“恢复”您的语言环境,而另一个线程可能仍在解析并期望该"C"
语言环境有效。
幸运的是,可以保证语言环境将"C"
在程序启动时启动,因此您只需要确保您或您使用的任何其他库都不会设置LC_NUMERIC
(或者LC_ALL
当然)与不兼容的语言环境"C"
。然后,您可以根据需要使用 undefined 重建库HAVE_SETLOCALE
,但这可能无关紧要,因为它的调用setlocale()
不会产生实际影响。