Критический раздел 2-я попытка?
Следующий алгоритм для задачи взаимного исключения не удовлетворяет свойству взаимного исключения. это удовлетворить тупик, голод? И также это работает правильно в отсутствии раздора?
int p=1;
int q=1;
process P process Q
while(true){ while(true){
a1 : nonCriticallSection1; a2 : nonCriticallSection1;
b1 : while (q !=1){ do nothing} b2 : while (p !=1){ do nothing}
c1 : p=0; c2 : q=0;
d1 : critical section d2 : critical section
e1 : p=1; e2 : q=1;
} }
end P; end Q;
1 ответ
Ваш алгоритм должен быть в порядке для тупика, голодания и раздора.
Однако этот вид решения не масштабируется и будет работать только для 2 процессов, что, вероятно, не то, что вы ищете.
Вы можете взглянуть на запись в википедии для тупика, чтобы найти полезный алгоритм.
РЕДАКТИРОВАТЬ: я не могу голодать, так как вы устанавливаете флаг для каждого процесса, который говорит, когда процесс хочет войти в критическую секцию. Таким образом, если процесс P владеет критической секцией, но процесс Q хочет войти, он сделает это, когда P завершит критическую секцию, потому что даже если cheduler решит повторно выполнить P, сама P проверит, q==0, и если так, то будет,
Конечно, твой пример - учебный пример. Он не будет работать в реальном приложении, так как использует опрос и, возможно, бесконечные циклы. Я настоятельно рекомендую не пытаться использовать его.