/ / Коли це відбувається? Нитка підвішена, перебуваючи в критичному розрізі - багатопотокова, мовно-агностична

Коли це станеться? Вона призупинена під час критичного розділу - багатопоточність, мова-агностик

Мені просто цікаво, якщо нитка знаходиться в критичному розрізі, чи можна її випустити?

  • Нитка А: Введіть CR
  • Нитка А: Призупинено
  • Нитка Б: Хоче ввести CR, але не може, тому що Нитка А має замок

Якщо Нитка А попереджено, і тому замикається замок mutex Нитка А, що з цим можна зробити?

Відповіді:

5 за відповідь № 1

Звичайно, це можна попередити. В іншому випадку, як інші потоки можуть спробувати увійти до цього критичного розділу, якщо єдиним потоком, який дозволено запускати в процесі, є потік, якому належить критичний розділ?

Потік B у вашому прикладі зачекає, поки нитка Aперенесено на розклад і закінчено з невід'ємним розділом. Тут не дивно. І якщо потік A, перебуваючи у критичному розділі, також чекає мьютексу, що належить Теаду B, то це тупиковий шлях, який ви повинні вирішити, переглянувши свою логіку.


6 для відповіді № 2

Припустимо, потік A випереджається вищим пріоритетомпотік C. Тепер припустимо, що потік B насправді вищий пріоритет, ніж C. Якщо B стає запущеним, у вас є класичний випадок інверсії пріоритету; Потік B (високий пріоритет) застряг в очікуванні ресурсу, який утримує Thread A (низький пріоритет). Одним із ліків від цього називається пріоритетне успадкування.

З пріоритетним успадкуванням, коли B блокує дляресурс, який утримується A (критичний розділ), потік A тимчасово "успадковує" пріоритет потоку B. Це дозволяє A запобігати тому докучливому потоку середнього пріоритету C, і коли A закінчує роботу з ресурсом, A повертається до початкового пріоритет. Це виводить A зі шляху B, так би мовити, усуваючи глухий замок.