flockfile, ftrylockfile, funlockfile - blokowanie strumienia FILE dla stdio
Standardowa biblioteka C (
libc,
-lc)
#include <stdio.h>
void flockfile(FILE *filehandle);
int ftrylockfile(FILE *filehandle);
void funlockfile(FILE *filehandle);
Wszystkie funkcje powyżej:
/* Since glibc 2.24: */ _POSIX_C_SOURCE >= 199309L
|| /* glibc <= 2.23: */ _POSIX_C_SOURCE
|| /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
Powyższe funkcje stdio są przystosowane do pracy
wielowątkowej. Uzyskuje się to przez przypisanie każdemu
z obiektów
FILE licznika blokad oraz (jeśli
wartość licznika jest niezerowa) wątku
będącego jego właścicielem. Przy każdym
wywołaniu funkcji bibliotecznej funkcje te czekają, aż
obiekt
FILE nie będzie już blokowany przez inny
wątek, a następnie go blokują, wykonują
żądane operacje wejścia/wyjścia i
odblokowują obiekt ponownie.
(Uwaga: blokowanie to nie ma nic wspólnego z blokowaniem plików za
pomocą funkcji w rodzaju
flock(2) i
lockf(3)).
Wszystko to dzieje się w sposób niewidoczny dla programisty C,
jednak mogą pojawić się dwa powody wymagające
bardziej szczegółowej kontroli. Z jednej strony szereg operacji
wejścia/wyjścia wykonywanych w jednym wątku może
stanowić całość, która nie może
zostać przerwana przez operację wejścia/wyjścia
innego wątku. Z drugiej zaś strony może istnieć
potrzeba uniknięcia narzutu wywołanego przez pojedyncze blokady
w celu uzyskania większej wydajności.
W takich sytuacjach wątek może jawnie zablokować obiekt
FILE, wykonać szereg operacji wejścia/wyjścia i
odblokować go. Uniemożliwia to innym wątkom
przeszkadzanie w międzyczasie. Jeśli powodem
założenia blokady ma być osiągnięcie
większej wydajności, wykonuje się operacje
wejścia/wyjścia za pomocą nieblokujących wersji
funkcji stdio:
getc_unlocked(3) oraz
putc_unlocked(3) zamiast
getc(3) i
putc(3).
Funkcja
flockfile() czeka aż
*filehandle nie będzie
zablokowany przez inny wątek, a następnie czyni
bieżący wątek właścicielem
*filehandle i zwiększa o jeden licznik blokad.
Funkcja
funlockfile() zmniejsza licznik blokad o jeden.
Funkcja
ftrylockfile() jest nieblokującą wersją
flockfile(). Nie robi nic, gdy inny wątek jest
właścicielem
*filehandle, a w przeciwnym przypadku
przejmuje własność i zwiększa licznik blokad o
jeden.
Funkcja
ftrylockfile() zwraca zero w przypadku sukcesu (blokada
została założona), a wartość
niezerową w razie niepowodzenia.
Brak.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
flockfile(), ftrylockfile(), funlockfile() |
Bezpieczeństwo wątkowe |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Funkcje te są dostępne, gdy zdefiniowane jest
_POSIX_THREAD_SAFE_FUNCTIONS.
unlocked_stdio(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Andrzej Krzysztofowicz <
[email protected]> i Robert
Luberda <
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]