2 votes

vfprintf_unlocked() équivalent ?

J'ai remarqué qu'IBM z/OS 2.3.0 offre vfprintf_unlocked() .

Je ne trouve pas d'équivalent dans la glibc (2.17 sur CentOS 7). Cette fonction est-elle spécifique à IBM ? Ou est-elle disponible dans certains en-têtes ? Si ce n'est pas le cas, toute fonction similaire à vfprintf_unlocked() qui est plus léger (par exemple, pas de thread safe) et qui peut prendre printf pour écrire dans le fichier ?

Merci de votre attention !

1voto

Employed Russian Points 50479

Je ne trouve pas d'équivalent dans la glibc (2.17 sur CentOS 7).

Il n'y en a pas. Pour connaître les fonctions disponibles, procédez comme suit :

nm -D /path/to/libc.so.6 | grep '_unlocked$'

En général, les vfprintf est si "lourd" que le coût de verrouillage et de déverrouillage du flux ne sera pas assez important, à moins que vous ne fassiez quelque chose d'extrêmement sous-optimal, tel que l'impression d'un seul caractère à la fois.

1voto

Florian Weimer Points 15524

Vous pouvez appeler __fsetlocking (stream, FSETLOCKING_BYCALLER) pour indiquer à la glibc que le verrouillage sera effectué en externe. Dans ce cas, l'appel à des fonctions régulières comme vfprintf en stream n'effectue aucun verrouillage. Voir l'article stdio_ext(3) page de manuel pour plus d'informations.

Il est également possible d'appeler le flockfile fonction qui fait également partie de POSIX. Dans l'implémentation de la glibc, aucune opération atomique n'est effectuée sur les appels de fonction de flux suivants tels que vfprintf ce qui permet également d'éviter le surcoût lié au verrouillage.

Les deux opérations sont collantes et persistent à travers les appels à la fonction _unlocked jusqu'à ce que leurs effets soient annulés par un autre appel à la fonction __fsetlocking ou à funlockfile .

Dans les deux cas, le résultat net sera qu'il n'y aura pratiquement pas de différence de performance entre le système existant et le système actuel. _unlocked et les fonctions régulières, sauf lorsque le _unlocked est implémentée comme une fonction ou une macro en ligne (comme dans putc_unlocked ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X