2

我在 Ubuntu ( json-c/json.h ) 下使用 C JSON 库。我需要在多个 POSIX 线程上解析 JSON 字符串。目前正在使用 json_tokener_parse() 方法 - 这是多线程安全还是我需要使用其他东西?

谢谢

4

1 回答 1

4

我查看了代码: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_NUMERICis not"C"或一开始的语言环境不兼容,这将导致问题,因为一个线程将“恢复”您的语言环境,而另一个线程可能仍在解析并期望该"C"语言环境有效。

幸运的是,可以保证语言环境将"C"在程序启动时启动,因此您只需要确保您或您使用的任何其他库都不会设置LC_NUMERIC(或者LC_ALL当然)与不兼容的语言环境"C"。然后,您可以根据需要使用 undefined 重建库HAVE_SETLOCALE,但这可能无关紧要,因为它的调用setlocale()不会产生实际影响。

于 2014-10-15T04:32:48.323 回答