JSON C库是线程安全的吗?

时间:2014-10-15 04:06:39

标签: c json multithreading json-c

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

日Thnx

1 个答案:

答案 0 :(得分: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(或{{1当然)到与LC_ALL不兼容的语言环境。然后,如果需要,您可以使用"C"未定义重建库,但这可能无关紧要,因为它对HAVE_SETLOCALE的调用没有实际效果。

相关问题