`asprintf`是线程安全的吗?

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

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

考虑示例代码:

 #define _GNU_SOURCE #include  #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在并发线程中被调用怎么办? 没有坏事会发生,他们会吗?

是的,它是线程安全的,除非它读取语言环境。

asprintf

function:int asprintf(char ** ptr,const char * template,…)
初步:| MT-Safe区域设置| AS-Unsafe堆| AC-Unsafe mem

关于’locale’ 例外 ,特别是:

使用区域设置注释的函数作为MT-Safety问题从区域设置对象读取而不进行任何forms的同步。 使用与语言环境更改同时调用的语言环境注释的函数可能会以与执行期间活动的任何语言环境不对应的方式运行,但其行为不可预测。

这些类型的函数被称为“有条件”multithreading安全,因为在某些情况下,它们结果并非如此,因此程序员需要处理这些问题。

glibc是免费软件 ,可能是实现asprintf的唯一(或最重要)库。

因此,您可以学习(甚至有助于改进)其源代码。 请参阅其stdio-common / asprintf.c和libio / vasprintf.c源文件。

看起来确实如此,它以线程安全的方式调用malloc和相关的东西。