6

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在并发线程中被调用怎么办?不会有坏事发生吧?

4

2 回答 2

6

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

asprintf

函数: int asprintf (char **ptr, const char *template, ...)
初步:| MT-安全语言环境 | AS-不安全堆 | AC-不安全的内存

关于“语言环境”异常,特别是:

使用语言环境注释的函数作为 MT 安全问题从语言环境对象读取,无需任何形式的同步。使用区域设置注释的函数与区域设置更改同时调用的方式可能与其执行期间的任何活动区域设置不对应,而是其不可预知的混合。

这些类型的函数被称为“有条件的”多线程安全,因为在某些情况下,事实证明它们不是,所以程序员需要注意这一点。

于 2015-02-17T13:30:33.860 回答
2

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

所以你可以研究(甚至有助于改进)它的源代码。查看它的stdio-common/asprintf.clibio/vasprintf.c源文件。

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

于 2015-02-17T13:27:36.607 回答