Является ли `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 ответа
Да, это потокобезопасный за исключением случаев, когда он читает локаль.
Функция: int asprintf (char **ptr, const char *template, …)
Предварительно: | MT-Safe локаль | AS-небезопасная куча | AC-небезопасный мем
Об исключении'locale', в частности:
Функции, помеченные как локаль как проблема MT-Safety, считываются из объекта локали без какой-либо синхронизации. Функции, аннотируемые с помощью локали, вызываемой одновременно с изменениями локали, могут вести себя так, что они не соответствуют ни одной из локалей, активных во время их выполнения, но непредсказуемым их сочетанием.
Эти виды функций известны как "условно" многопоточные безопасные, потому что в некоторых контекстах они оказываются не так, поэтому программист должен позаботиться об этом.
glibc - это свободное программное обеспечение и, вероятно, единственная (или самая важная) библиотека, реализующая asprintf
,
Таким образом, вы можете изучить (и даже внести свой вклад в улучшение) его исходный код. Смотрите его исходные файлы stdio-common / asprintf.c & libio / vasprintf.c.
Похоже, действительно, это вызывает потокобезопасным способом malloc
и связанные вещи.