繁体   English   中英

`asprintf`线程安全吗?

[英]Is `asprintf` thread-safe?

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

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

asprintf

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM