Provided by: manpages-ro-dev_4.27.0-1_all bug

NUME

       pthread_cond_init,         pthread_cond_signal,         pthread_cond_broadcast,        pthread_cond_wait,
       pthread_cond_timedwait, pthread_cond_destroy - operații asupra condițiilor

SINOPSIS

       #include <pthread.h>

       pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

       int pthread_cond_init(pthread_cond_t *cond,
                             pthread_condattr_t *cond_attr);
       int pthread_cond_signal(pthread_cond_t *cond);
       int pthread_cond_broadcast(pthread_cond_t *cond);
       int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
       int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
                             const struct timespec *abstime);
       int pthread_cond_destroy(pthread_cond_t *cond);

DESCRIERE

       O condiție (prescurtare de la „variabilă de condiție”) este un  mecanism  de  sincronizare  care  permite
       firelor  de  execuție să suspende execuția și să cedeze procesoarele până când este satisfăcută o anumită
       condiție (un predicat) privind datele partajate. Operațiile de bază ale  condițiilor  sunt:  semnalizarea
       condiției  (când  predicatul  devine  adevărat) și așteptarea condiției, suspendând execuția firului până
       când un alt fir semnalizează condiția.

       O variabilă de condiție trebuie să fie întotdeauna asociată cu un  mutex,  pentru  a  evita  condiția  de
       „competiție  pentru obținerea de date” în care un fir se pregătește să aștepte pe o variabilă de condiție
       și un alt fir semnalizează condiția chiar înainte ca primul fir să aștepte efectiv pe ea.

       pthread_cond_init inițializează variabila de condiție cond, utilizând atributele de condiție  specificate
       în  cond_attr  sau atributele implicite dacă cond_attr este NULL. Implementarea „LinuxThreads” nu acceptă
       atribute pentru condiții, prin urmare parametrul cond_attr este de fapt ignorat.

       Variabilele de  tip  pthread_cond_t  pot  fi,  de  asemenea,  inițializate  static,  utilizând  constanta
       PTHREAD_COND_INITIALIZER.

       pthread_cond_signal  repornește  unul dintre firele care așteaptă variabila de condiție cond. În cazul în
       care niciun fir de execuție nu așteaptă pe cond, nu se întâmplă nimic. În cazul în care  mai  multe  fire
       așteaptă pe cond, se repornește exact unul dintre ele, dar nu se specifică care.

       pthread_cond_broadcast  repornește  toate firele care așteaptă variabila de condiție cond. Nu se întâmplă
       nimic dacă niciun fir de execuție nu așteaptă pe cond.

       pthread_cond_wait deblochează atomic mutex (conform pthread_unlock_mutex) și  așteaptă  ca  variabila  de
       condiție  cond  să  fie  semnalată. Execuția firului este suspendată și nu consumă timp de procesare până
       când variabila de condiție este semnalată. mutex trebuie să fie blocată de firul apelant la  intrarea  în
       pthread_cond_wait.  Înainte  de  a  reveni la firul apelant, pthread_cond_wait recuperează mutex (conform
       pthread_lock_mutex).

       Deblocarea mutex-ului și suspendarea pe variabila de condiție se face atomic. Astfel, dacă  toate  firele
       achiziționează  întotdeauna  mutex-ul înainte de a semnaliza condiția, acest lucru garantează că condiția
       nu poate fi semnalată (și, prin urmare, ignorată) între momentul în care un  fir  blochează  mutex-ul  și
       momentul în care așteaptă pe variabila de condiție.

       pthread_cond_timedwait  deblochează  atomic  mutex  și așteaptă pe cond, la fel ca pthread_cond_wait, dar
       limitează și durata așteptării. Dacă cond nu a  fost  semnalată  în  intervalul  de  timp  specificat  de
       abstime, mutex-ul mutex este reacceptat din nou, iar pthread_cond_timedwait returneazǎ eroarea ETIMEDOUT.
       Parametrul  abstime  specifică  un  timp absolut, cu aceeași origine ca și time(2) și gettimeofday(2): un
       abstime de 0 corespunde la 00:00:00 GMT, 1 ianuarie 1970.

       pthread_cond_destroy distruge o variabilă de condiție, eliberând resursele pe care le-ar  putea  conține.
       La  intrarea  în  pthread_cond_destroy nu trebuie să existe fire de execuție care să aștepte variabila de
       condiție. În implementarea „LinuxThreads”, nu există resurse asociate variabilelor  de  condiție,  astfel
       încât  pthread_cond_destroy  nu face de fapt nimic, cu excepția verificării faptului că nu există fire de
       execuție în așteptare.

ANULARE

       pthread_cond_wait și pthread_cond_timedwait sunt puncte de anulare. Dacă un fir este anulat  în  timp  ce
       este  suspendat  într-una  din  aceste  funcții,  firul își reia imediat execuția, apoi blochează din nou
       argumentul mutex la pthread_cond_wait și  pthread_cond_timedwait  și,  în  final,  execută  anularea.  În
       consecință, gestionarii de curățare sunt asigurați că mutex este blocat atunci când sunt apelați.

SIGURANȚA SEMNALELOR ASINCRONE

       Funcțiile  de  condiție  nu  sunt sigure pentru semnale asincrone și nu ar trebui să fie apelate de la un
       gestionar de semnal. În  special,  apelarea  pthread_cond_signal  sau  pthread_cond_broadcast  de  la  un
       gestionar de semnal poate bloca firul apelant.

VALOAREA RETURNATĂ

       Toate  funcțiile  de  variabilă  de condiție returnează 0 în caz de succes și un cod de eroare diferit de
       zero în caz de eroare.

ERORI-IEȘIRE

       pthread_cond_init,  pthread_cond_signal,  pthread_cond_broadcast  și  pthread_cond_wait   nu   returnează
       niciodată un cod de eroare.

       Funcția pthread_cond_timedwait returnează următoarele coduri de eroare în caz de eroare:

              ETIMEDOUT
                     Variabila  de  condiție  nu  a  fost  semnalată  până  la  expirarea  timpului de așteptare
                     specificat de abstime.

              EINTR  pthread_cond_timedwait a fost întrerupt de un semnal.

       Funcția pthread_cond_destroy returnează următorul cod de eroare în caz de eroare:

              EBUSY  Unele fire sunt în prezent în așteptare pe cond.

CONSULTAȚI ȘI

       pthread_condattr_init(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), gettimeofday(2), nanosleep(2).

EXEMPLU

       Se consideră două variabile partajate x și y, protejate de mutex-ul mut, și o variabilă de condiție  cond
       care trebuie semnalată ori de câte ori x devine mai mare decât y.

              int x,y; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

       Așteptarea până când x este mai mare decât y se efectuează după cum urmează:

              pthread_mutex_lock(&mut); while (x <= y) {         pthread_cond_wait(&cond, &mut); } /* operează asupra lui x și y */ pthread_mutex_unlock(&mut);

       Modificările  lui  x  și y care pot face ca x să devină mai mare decât y trebuie să semnalizeze condiția,
       dacă este necesar:

              pthread_mutex_lock(&mut); /* modificarea lui x și y */ if (x > y) pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mut);

       Dacă se poate dovedi că cel mult un singur fir în așteptare trebuie  să  fie  trezit  (de  exemplu,  dacă
       există  doar două fire care comunică prin x și y), pthread_cond_signal poate fi utilizat ca o alternativă
       puțin mai eficientă la pthread_cond_broadcast. În caz de îndoială, utilizați pthread_cond_broadcast.

       Pentru a aștepta ca x să devină mai mare decât y cu un timp de așteptare de 5 secunde, faceți:

              struct timeval now; struct timespec timeout; int retcode;  pthread_mutex_lock(&mut); gettimeofday(&now); timeout.tv_sec = now.tv_sec + 5; timeout.tv_nsec = now.tv_usec * 1000; retcode = 0; while (x <= y && retcode != ETIMEDOUT) {         retcode = pthread_cond_timedwait(&cond, &mut, &timeout); } if (retcode == ETIMEDOUT) {         /* a avut loc terminarea timpului de așteptare */ } else {         /* operează asupra lui x și y */ } pthread_mutex_unlock(&mut);

TRADUCERE

       Traducerea   în   limba   română   a   acestui   manual   a   fost   făcută   de   Remus-Gabriel    Chelu
       <remusgabriel.chelu@disroot.org>

       Această  traducere  este  documentație  gratuită;  citiți  Licența publică generală GNU Versiunea 3 sau o
       versiune  ulterioară  cu  privire  la  condiții  privind  drepturile  de  autor.   NU  se   asumă   NICIO
       RESPONSABILITATE.

       Dacă  găsiți  erori  în  traducerea  acestui manual, vă rugăm să trimiteți un e-mail la translation-team-
       ro@lists.sourceforge.net.

Pagini de manual de Linux 6.9.1                   16 iunie 2024                             pthread_cond_init(3)