|
|
||
4. Задача взаимного исключения для двух потоков |
||
Ниже приведено простейшее из известных решений задачи взаимного исключения для двух потоков, которое было опубликовано Гэри Л. Петерсоном в 1981 году. |
||
| bool xl = false; bool x2 = false; int q; // номер потока, которому предоставляется очередь входа в критическую секцию void thread_l() // поток thread_l { while(true) { non_critical_section_l(); // код вне критической секции xl = true; // поток thread_l хочет войти в критическую секцию q = 2; // предоставить очередь потоку thread_2 while(х2 && q == 2); // ждем, пока в критической секции находится поток thread_2 critical_section_l(); // входим в критическую секцию xl = false; // поток thread_l находится вне критической секции } } void thread_2() // поток thread_2 { while(true) { non_critical_section_2(); // код вне критической секции х2 = true; // поток thread_2 хочет войти в критическую секцию q = 1; // предоставить очередь потоку thread_l while(xl && q == 1); // ждем, пока в критической секции находится поток thread_l critical_section_2(); // входим в критическую секцию х2 = false; // поток thread_2 находится вне критической секции } } |
||
Покажем, что это решение удовлетворяет трем вышеперечисленным требованиям, предъявляемым к решению задачи взаимного исключения. Символ = обозначает равносильность или, другими словами, логическую эквивалентность выражений. Теперь рассмотрим требование поступательности. Поток thread i может быть заблокирован, только если выполняется условие (х2 && q == 2). Аналогично, поток thread_2 может заблокироваться только при выполнении условия (х 1 && q == 1). Рассмотрим предикат (х2 && q == 2) && (х 1 && q == 1) и найдем его истинностное значение. Получим: Наконец покажем, что решение Петерсона удовлетворяет требованию справедливости. Для этого предположим противное, т. е. поток thread_1 заблокирован. Тогда должно выполняться условие (х2 && q == 2). Из истинности этого условия следует, что ВЫПОЛНЯЮТСЯ условия (х2 «« true) И (q — 2). Но из выполнения условия поступательности следует, что поток thread_2 не может быть заблокирован одновременно с потоком thread_1. Следовательно, должны также выполняться условия (х2 == false) или (q == 1). Получили противоречие с нашим предположением. Поэтому наше предположение неверно и поток thread_1 не может быть заблокирован. Таким образом, доказано, что алгоритм Петерсона решает задачу взаимного исключения для двух потоков. Решение задачи взаимного исключения для произвольного количества потоков является более сложным. |
||
4 |