“asprintf”函数是线程安全的吗?

6

GNU函数asprintf(打印到分配的字符串)是否线程安全?

基本上,这归结为问题是malloc是否线程安全。

考虑以下示例代码:

#define _GNU_SOURCE
#include <stdio.h>

#include "getValue.h"

char * getValue(int key) {
  char * value;
  asprintf(&value, "%d", key); // TODO: No error handling!
  // If memory allocation wasn't possible, or some other error occurs,  these  functions  will
  // return -1, and the contents of strp is undefined.
  return value;
}

在这里,我不会涉及任何全局变量。如果我的getValue在并发线程中被调用会怎么样呢?不会发生坏事,对吗?


4
如果malloc不是线程安全的话,用户将会有问题。 - stefan
2个回答

6

除了读取区域设置时,它是线程安全的。

asprintf

函数:int asprintf (char **ptr, const char *template, …)
初步: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem

关于“locale”异常,特别是:

被标注为MT-Safety问题的带有locale的函数在没有任何形式的同步的情况下从locale对象中读取。与区域设置同时调用的带有locale注释的函数可能会以不对应其执行期间任何活动区域设置的方式行事,而是其中的不可预测混合物。

这些类型的功能被称为“有条件地”多线程安全,因为在某些上下文中,它们实际上并不安全,所以程序员需要注意。


我刚刚查看了参考的POSIX安全概念,但是没有提到有关区域设置异常的提示。因此,为了能够像上面的“初步:…”那样阅读这些行,我需要进一步理解像“locale”、“heap”、“mem”这样的修饰符的含义。我可以在哪里查找这些信息? - imz -- Ivan Zakharyaschev
2
一些平台提供了asprintf_l函数,它接受一个locale_t参数,并且应该是完全线程安全的。 - nwellnhof

2

2
那是K&R函数参数风格吗? - bolov
是的,针对_IO_vasprintf - Basile Starynkevitch
1
为什么在2015年glib中使用了那个? - bolov
1
因为没有人关心过向 C99 的过渡发送补丁。如果您关心,请填写法律文件并提出补丁。请参阅 glibc 贡献清单 - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接