`asprintf`线程安全吗?

时间:2015-02-17 13:20:38

标签: c multithreading printf glibc asprintf

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

(IIC,基本上,这归结为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在并发线程中被调用怎么办?没有坏事会发生,他们会吗?

2 个答案:

答案 0 :(得分:6)

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

asprintf

  

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

关于'locale'exception,特别是:

  

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

这些函数被称为"conditionally"多线程安全,因为在某些情况下,它们结果不是,所以程序员需要处理它。

答案 1 :(得分:2)

glibcfree software,可能是实施asprintf的唯一(或最重要)库。

因此,您可以学习(甚至contribute改进)其源代码。见其stdio-common/asprintf.c&amp; libio/vasprintf.c源文件。

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