Robert Lov - kernel development linux - pagina 58

Utilizând semafoare

Funcția down_interruptible () încearcă să apucă acest semafor. Dacă această încercare nu reușește, lucrarea este pusă într-o stare de așteptare cu semnalizatorul TASK_INTERRUPTIBLE. Din materialul din capitolul 3, trebuie reamintit că această stare a procesului înseamnă că slujba poate fi returnată spre executare printr-un semnal și că această oportunitate este de obicei foarte valoroasă. Dacă semnalul apare într-un moment în care lucrarea așteaptă să elibereze semaforul, atunci lucrarea este returnată la execuție, iar funcția down_interruptible () returnează -EINTR. O alternativă la această funcție este funcția în jos (). care pune lucrarea într-o stare de așteptare cu steagul TASK_UNINTERRUPTIBLE. În cele mai multe cazuri, acest lucru este nedorit, deoarece procesul care se așteaptă să elibereze semaforul nu va răspunde la semnale. Prin urmare, funcția down_interruptible () este folosită mult mai mult decât funcția în jos (). Da, numele acestor funcții, desigur, sunt departe de a fi ideale.







Funcția down_trylock () este utilizat pentru captarea declarat semaforului non-blocare. Dacă semaforul este deja capturat, funcția returnează imediat o valoare diferită de zero. Dacă blocarea este reușită, o valoare zero este returnată și blocarea este capturată.







Pentru a elibera un semafor capturat, trebuie să apelați (). Luați în considerare următorul exemplu.

valoarea contorului inițial este de 1 * /

Este necesar să intrați în starea de așteptare (abruptă) când blocarea este blocată

Trebuie să utilizați semnafore

Variabile condiționate

Variabila variabilă (variabila de completare) este un mijloc simplu de sincronizare între două lucrări care funcționează în modul kernel, când este necesar ca o lucrare să trimită un semnal altui eveniment care a avut loc. O lucrare așteaptă variabila condiționată, în timp ce cealaltă lucrare nu efectuează o anumită activitate. Când o altă lucrare își încheie activitatea, utilizează o variabilă condiționată pentru a returna toate lucrările care așteaptă. Dacă acest lucru pare a fi un semafor, atunci exact așa este, ideea este aceeași. De fapt, variabilele condiționale oferă pur și simplu o soluție simplă la o problemă pentru care semaphorele sunt folosite în alte situații. De exemplu, în apelul de sistem vfork (), o variabilă condiționată este utilizată pentru a reveni la procesul părinte la finalizarea copilului.

Variabilele condiționate sunt reprezentate utilizând structura de finalizare a structurii. care este definită în dosar .

O variabilă condițională statică poate fi creată utilizând o macrocomandă

O variabilă condițională creată dinamic poate fi inițializată cu funcția init_completion ().







Trimiteți-le prietenilor: