Les fonctions du thread de bibliothèque standard C sont-elles sûres?

Où puis-je obtenir une réponse définitive, que ma memcpy (utilisant l’implémentation eglibc fournie avec Ubuntu) soit thread-safe? – Honnêtement, je n’ai vraiment pas trouvé clairement OUI ou NON dans la documentation.

En passant, avec “thread safe”, je veux dire qu’il est sûr d’utiliser memcpy simultanément lorsqu’il est possible de copier simultanément l’octet de la date pour l’octet. Cela devrait être possible au moins si les données en lecture seule sont copiées dans des régions qui ne se chevauchent pas.

Idéalement, j’aimerais voir quelque chose comme les listes au bas de cette page dans la documentation du compilateur ARM.

Vous pouvez trouver cette liste ici, au chapitre 2.9.1 Thread-Safety : http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01

C’est-à-dire qu’il s’agit d’une liste de fonctions que POSIX n’a pas besoin d’être thread-safe. Toutes les autres fonctions doivent être thread-safe. Posix inclut la bibliothèque standard C et les interfaces “unix” typiques. (Liste complète ici, http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html )

memcpy () est spécifié par posix, mais ne fait pas partie de la liste de la version 2.9.1, et peut donc être considéré comme thread-safe.

Les divers environnements sur linux essaient au moins de mettre en œuvre posix au mieux de ses possibilités – Les fonctions sur linux / glibc pourraient être thread-safe même si posix ne l’exige pas – bien que cela soit rarement documenté. Pour les fonctions / bibliothèques autres que celles couvertes par posix, il vous rest ce que leurs auteurs ont documenté …

D’après ce que je peux dire, posix assimile la sécurité du fil à la réentrance et garantit qu’il n’y a pas de courses de données internes. Cependant, vous êtes responsable des courses de données externes possibles, telles que la protection de l’appel par exemple memcpy () avec de la mémoire pouvant être mise à jour simultanément.

Cela dépend de la fonction et de la façon dont vous l’utilisez.

Prenez par exemple memcpy , il est généralement thread-safe si vous copiez des données dont la source et la destination sont privées dans un seul thread . Si vous écrivez des données qui peuvent être lues / écrites par un autre thread, le thread n’est plus sécurisé et vous devez protéger l’access.

Si une fonction glibc n’est pas thread-safe, la page de manuel l’indiquera , et il y aura (probablement) une variante thread-safe également documentée.

Voir, par exemple, man strtok :

SYNOPSIS #include

  char *strtok(char *str, const char *delim); char *strtok_r(char *str, const char *delim, char **saveptr); 

Le _r (pour “réentrant”) est la variante thread-safe.

Malheureusement, les pages de manuel ne prennent pas l’habitude de dire qu’une fonction est thread-safe, mais ne mentionnent que thread-safety lorsqu’il s’agit d’un problème.

Comme avec toutes les fonctions, si vous lui donnez un pointeur sur une ressource partagée, elle deviendra alors thread-unsafe. C’est à vous de gérer le locking.