Мені просто цікаво, якщо нитка знаходиться в критичному розрізі, чи можна її випустити?
- Нитка А: Введіть 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, так би мовити, усуваючи глухий замок.