Qt 4

De-a lungul documentației termenii reintrare și a firului de siguranță este utilizat pentru a se referi la clase și funcții pentru a indica modul în care acestea pot fi utilizate în aplicații multithreaded:

  • Funcția thread-safe pot fi apelate simultan de mai multe fire, chiar și atunci când apelurile utilizează date distribuite, deoarece orice acces la datele partajate în ordine.
  • O funcție reentrant poate fi numit simultan de mai multe fire, dar numai în cazul în care fiecare apel folosește propriile sale date.

Astfel, o functie thread-safe este întotdeauna reintrare. dar nu întotdeauna funcția de reintrare fir în condiții de siguranță.

Într-un sens mai larg, clasa se numește reintrare. în cazul în care funcțiile de membru poate fi numit în condiții de siguranță din fire multiple, atâta timp cât fiecare fir utilizează propria instanță separată a clasei. Clasa este thread-safe. în cazul în care funcțiile de membru poate fi numit în condiții de siguranță din mai multe fire, chiar dacă toate firele împărtășesc aceeași instanță a clasei.

Notă: clase Qt documentate ca thread-safe. numai în cazul în care acestea sunt concepute pentru a lucra în aplicații multi-threaded. Dacă funcția nu este marcat ca un fir de siguranță sau reentrante, acesta nu ar trebui să fie utilizate în fire diferite. În cazul în care clasa nu este marcat ca firele de executie sau de reintrare, apoi într-o anumită instanță a unei clase nu ar trebui să aibă acces la fire diferite.

reintrare

clasele C ++ sunt de multe ori reentrante, pur și simplu pentru că ei au acces doar la datele membrilor săi. Orice fir poate apela o funcție de membru reentrant instanță a clasei, în timp ce nici un alt fir nu poate apela o funcție de membru aceeași instanță a unei clase în același timp. De exemplu, clasa Counter de mai jos este reintrare:

Această clasă nu este thread-safe, pentru că în cazul în care mai multe fire de a încerca să modifice cīmpul n. rezultatul nu este definit. Acest lucru se datorează faptului că operatorii ++ si - nu sunt neapărat atomice. De fapt, se extind de obicei la trei instrucțiuni mașină:

  1. Încărcarea valoare variabilă în registru.
  2. Creșterea sau reducerea valorii de registru.
  3. Salvați înregistra valoarea înapoi la memoria principală.

Fluxurile A și B în același timp se poate descărca vechea valoare a variabilei, crește valoarea sa în registru și de a salva valoarea variabilei în memorie, dar variabila va fi mărită doar o singură dată!

fir

Un flux trebuie să execute etapele 1, 2, 3 fără întrerupere (atomically) înainte ca firul B se poate efectua aceiași pași; sau vice-versa. Cel mai simplu mod de a face firul de clasă este de a proteja toate căile de acces la membrii de date cu un QMutex:

clasa QMutexLocker blochează automat mutex în constructorul și deblochează-l atunci când destructor este invocat la sfârșitul funcției. Blocarea unui mutex garantează că tratamentul diferitelor fluxuri vor fi comandate. membru de date mutex declarate ca mutabil. deoarece vă permite să bloca și debloca mutex în funcție de valoare (). care este o constantă.

Note cu privire la clasele Qt

Cele mai multe clase Qt sunt reintrare. dar nu fir în condiții de siguranță. întrucât o astfel de punere în aplicare ar necesita costuri suplimentare pentru blocarea repetată și QMutex deblocare. De exemplu, un QString este reintrare, dar nu fir în condiții de siguranță. Puteți accesa cu ușurință un număr de cazuri de QString din mai multe fire în același timp, dar nu se poate obține cu ușurință acces la aceeași instanță de QString din mai multe fire în același timp (dacă tu nu oferă protecție împotriva accesului prin QMutex).

Unele clase și funcția thread-safe Qt. Acest lucru este, în principal legate de clasa fluxurilor (de exemplu, QMutex) și funcțiile de bază (de exemplu, QCoreApplication :: postEvent ()).

Notă: terminologia din domeniul multi-threading nu este încă pe deplin standardizate. POSIX utilizează o definiție oarecum diferită de reentrancy și fir pentru dvs. API C. Atunci când se utilizează alte C ++ bibliotecă de clasă orientate pe obiect, în combinație cu Qt asigurați-vă că definițiile lor sunt clare.

Toate celelalte mărci comerciale sunt proprietatea deținătorilor lor. Politica de confidențialitate

Licențiații care dețin licențe comerciale valabile din Qt, se poate utiliza acest document, în conformitate cu acordurile de licență comerciale Qt, furnizate cu software-ul, sau, în mod alternativ, în conformitate cu condițiile prevăzute într-un acord scris între dumneavoastră și Nokia.

Încercarea de a traduce documentația Qt.
Dacă doriți să se alăture, sau dacă aveți comentarii sau sugestii, apoi du-te la forum: documentația de traducere în limba română Qt.
Oamenii care au contribuit la traducerea: Echipa de traducatori