/ / Kedy sa to stane? Vlákno pozastavené v kritickej sekcii - viacvláknové, jazykovo agnostické

Kedy sa to stane? Závit pozastavený v kritickej sekcii - multithreading, jazyk-agnostic

Len by ma zaujímalo, či je vlákno v kritickej časti, dá sa tomu predísť?

  • Závit A: Zadajte CR
  • Závit A: Dostanete pozastavenie
  • Závit B: Chce vstúpiť do ČR, ale nemôže, pretože Závit A má zámok

ak Závit A zamedzené, a tak je zámok mutex prilepený Závit A, čo sa s tým dá robiť?

odpovede:

5 pre odpoveď č. 1

Samozrejme, dá sa to predísť. Inak by sa iné vlákna mohli pokúsiť vstúpiť do tejto kritickej sekcie, ak jediným vláknom, ktoré je povolené bežať v rámci procesu, je vlákno, ktoré vlastní kritickú časť?

Vlákno B vo vašom príklade počká, kým vlákno Aje preplánovaný a je zakončený kortikálnou časťou. Žiadne prekvapenie. A ak vlákno A, zatiaľ čo je v kritickej časti, tiež čaká na mutex vlastnený hlavou B, potom je to zablokovanie, ktoré musíte vyriešiť revidovaním svojej logiky.


6 pre odpoveď č. 2

Predpokladajme, že vlákno A má vyššiu priorituvlákno C. Teraz predpokladajme, že vlákno B má v skutočnosti vyššiu prioritu ako C. Ak sa B stane spustiteľným, máte klasický prípad inverzie priority; Vlákno B (vysoká priorita) uviazlo pri čakaní na zdroj v držbe vlákno A (nízka priorita). Jeden liek na toto sa nazýva prioritné dedičstvo.

S prioritným dedičstvom, keď B blokuje preprostriedok držaný A (kritická časť), vlákno A dočasne „zdedí“ prioritu vlákna B. To umožňuje A predísť tomu, aby obťažoval vlákno C so strednou prioritou, a keď je A vykonané so zdrojom, A sa vráti späť k pôvodnému prioritou. Týmto sa A takpovediac dostane z B, eliminuje sa zablokovanie.