Критический раздел 2-й попытки? - PullRequest
0 голосов
/ 28 декабря 2011

Следующий алгоритм для задачи взаимного исключения не удовлетворяет свойству взаимного исключения. это удовлетворить тупик, голод? И также правильно ли он работает при отсутствии разногласий?

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 Ответ

0 голосов
/ 28 декабря 2011

Ваш алгоритм должен быть в порядке для тупиков, голодания и конфликтов.
Однако этот вид решения не масштабируется и будет работать только для 2 процессов, которые, вероятно, не то, что вы ищете.
Вы можете иметьПосмотрите на запись wikipedia'e для взаимоблокировки , чтобы найти полезный алгоритм.

РЕДАКТИРОВАТЬ: я не могу голодать, так как вы устанавливаете флаг для каждого процесса, который говорит, когда процесс хочет войти в критическую секцию.Таким образом, если процесс P владеет критической секцией, но процесс Q хочет войти, он сделает это, когда P завершит критическую секцию, потому что даже если cheduler решит повторно выполнить P, сама P проверит, q == 0, и если так, то будет ждать.
Конечно, твой пример - учебный пример.Он не будет работать в реальном приложении, так как использует опрос и, возможно, бесконечные циклы.Я настоятельно рекомендую не пытаться использовать его.

...