2015-02-17 16 views
6

La funzione GNU asprintf (stampa su stringa allocata) è thread-safe?È `asprintf` thread-safe?

(IIC, in fondo, questo si riduce a questione se malloc è thread-safe.)

consideri il codice di esempio:

#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; 
} 

Ecco, non mi toccare tutte le variabili globali. Cosa succede se il mio getValue viene chiamato in thread simultanei? Non succederanno cose brutte, vero?

+4

Gli utenti sarebbero condannati se malloc non fosse thread-safe: http://stackoverflow.com/questions/855763/is-malloc-thread-safe – stefan

risposta

6

Sì, è thread-safe tranne quando legge le impostazioni locali.

asprintf

Funzione: int asprintf (char ** ptr, const char * template, ...)
preliminare: | MT-Safe locale | Heap AS-Unsafe | AC-Unsafe mem

A proposito del 'locale' exception, in particolare:

funzioni annotate con locale come una questione di sicurezza MT-letto dall'oggetto locale senza alcuna forma di sincronizzazione. Le funzioni annotate con le impostazioni locali chiamate simultaneamente alle modifiche delle impostazioni internazionali possono comportarsi in modi che non corrispondono a nessuno dei locali attivi durante la loro esecuzione, ma a un mix imprevedibile.

Questi tipi di funzioni sono noti come "conditionally" multithread sicuro perché, in alcuni contesti, si rivelano non essere, in modo che il programmatore ha bisogno di prendersi cura di questo.

+0

Ho appena visto i riferimenti [POSIX Safety Concepts] (https://www.gnu.org/software/ libc/manual/html_node/POSIX-Safety-Concepts.html # POSIX-Safety-Concepts) e non ci sono suggerimenti sull'eccezione locale. Quindi, per me, in grado di leggere queste righe come il "Preliminare: ..." sopra, ho bisogno anche di capire il significato dei modificatori come "locale", "heap", "mem". Dove posso cercare quelli? –

+0

Aggiunti ulteriori riferimenti. Spero che tu possa risolvere i tuoi dubbi. – edmz

+2

Alcune piattaforme offrono 'asprintf_l' che accetta un parametro' locale_t' e dovrebbe essere completamente sicuro per i thread. – nwellnhof

2

glibc è free software ed è probabilmente l'unico (o il più importante) libreria che implementa asprintf.

Così puoi studiare (e anche contribute migliorare) il suo codice sorgente. Vedere i file di origine stdio-common/asprintf.c & libio/vasprintf.c.

Sembra davvero, sta chiamando in modo sicuro thread malloc e cose correlate.

+2

è lo stile del parametro di funzione K & R? – bolov

+0

Sì per '_IO_vasprintf' –

+1

Qualsiasi motivo particolare per cui viene utilizzato in leb ... nel 2015? – bolov

Problemi correlati