Алгоритм планировщика ЦП

Я пытаюсь смоделировать, что два моих процесса, которые выполняются на двух разных процессорах, входят в критическую секцию. Когда инструкция обоих процессов становится «CS», я хотел бы отправить один из них в заблокированную очередь. Однако, даже если я задаю последовательность инструкций двух процессов одинаково, и пока они работают в разных процессорах параллельно, они оба входят в критическую секцию в моем коде моделирования. Не могли бы вы проанализировать мой код и сказать мне, что я делаю неправильно?

void execute(CPU *cpu)
{
fetch(cpu);
while(cpu->instruction=="NI") {
    //printf("instruction : %s, instructionNo: %d, totalExecution in cpu:%d \n", cpu->instruction, cpu->instructionNo, cpu->totalExecuted);
    Sleep(1000);
    fetch(cpu);
}

if(cpu->instruction=="CS"){
    printf("process %d instruction no: %d",((PCB*) ((cpu->runningProcess)->dataPtr))->processID, cpu->instructionNo);
    WaitForSingleObject(csMutex, INFINITE);
        if(csBoolean==FALSE) {
            csBoolean==TRUE;
        }
        else if(csBoolean==TRUE) {
            printf("process %d suspended.",((PCB*) ((cpu->runningProcess)->dataPtr))->processID);
            ReleaseMutex(csMutex);
            contextSwitch(cpu);
            return;
        }
    ReleaseMutex(csMutex);

    printf("process %d entered its critical section.\n",((PCB*) ((cpu->runningProcess)->dataPtr))->processID);
    Sleep(3000);

    WaitForSingleObject(csMutex, INFINITE);
        csBoolean=FALSE;            
    ReleaseMutex(csMutex);

    ((PCB*)((cpu->runningProcess)->dataPtr))->instructionNo = cpu->instructionNo;
}

else if(cpu->instruction!="NI"){
    contextSwitch(cpu);
}
}

person Figen Güngör    schedule 28.12.2013    source источник
comment
Откуда ты знаешь, что это происходит?   -  person Oliver Charlesworth    schedule 28.12.2013
comment
Оба отпечатка этого процесса вошли в свою критическую секцию. Прежде чем я отпущу csBoolean (установив для него значение FALSE), я заставлю его ждать 3 секунды для другого процесса. Хотя другой процесс и этот имеют одинаковую последовательность инструкций.   -  person Figen Güngör    schedule 28.12.2013


Ответы (1)


Да, глупая Visual Studio не хотела беспокоить меня этой досадной синтаксической ошибкой:

 if(csBoolean==FALSE) 
  {
          csBoolean==TRUE;
  }
person Figen Güngör    schedule 28.12.2013
comment
логическая ошибка? что бы ни? не должен ли он сказать мне это? эй, это не условие или что-то в этом роде, ты имел в виду, что csBoolean=FALSE? Почему я хочу сделать что-то подобное? - person Figen Güngör; 28.12.2013
comment
Это допустимый синтаксис, так что да, это логическая ошибка. Я думаю, что IDE может быть сложно анализировать такие типы ошибок. Представьте, что это простейший случай. Но что произойдет, если csBoolean==TRUE может быть, например, внутри оператора printf()? Последнее конечно не проблема. - person Manos; 28.12.2013
comment
Хех, хороший улов, если бы мне давали цент каждый раз, когда со мной это происходит :) . И я также думаю, что это должно быть поймано любой уважающей себя IDE (результат игнорируется и никаких побочных эффектов не возникает) - person Leeor; 30.12.2013