Критический раздел 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, и если так, то будет,
Конечно, твой пример - учебный пример. Он не будет работать в реальном приложении, так как использует опрос и, возможно, бесконечные циклы. Я настоятельно рекомендую не пытаться использовать его.

Другие вопросы по тегам