В то время как цикл повторяется больше, чем я указал

Я делаю программу симуляции, управляемую часами, и, помимо прочего, мой основной цикл while, while(jobsCompleted < jobsToComplete) цикл больше раз, чем ожидалось / хотел. Например, если бы я должен был назначить 500 jobsToCompleteвывод в конце программы скажет мне, что было выполнено 505 заданий. Я пытался отладить эту проблему, по крайней мере, час, но безрезультатно. Любая помощь приветствуется. Спасибо!

#include <iostream>
#include <string>
#include <stdlib.h>
#include <queue>
#include <fstream>
#include "job.cpp"
using namespace std;

int main()
{
ofstream cpuSim;
cpuSim.open("cpuSim.out.txt");

int clock = 0, jobsCompleted = 0, jobsToComplete = 0, probUser = 0, probability, id = 0;
jobType_t job_type;
int inWQ, outWQ, inCPUQ, outCPUQ, required, given, jobTypeInt, timeSpentInCPUqueue = 0, timeSpentInWaitQueue = 0, CPUidle = 0;
queue<job> CPUqueue, waitQueue;

int numIO = 0, numCPU = 0;

srand(time(NULL));

cout << "Enter how many jobs need to be completed: ";
cin >> jobsToComplete;
cout << endl <<  "Enter the probability that a new job is created: ";
cin >> probUser;
cout << endl;

while(jobsCompleted < jobsToComplete)
{
clock++;
probability = rand() % 100 + 1;

if(probability > probUser)
{
for(int i=0; i<jobsToComplete; i++)
{
id = rand() % 1000 + 1;
jobTypeInt = rand() % 100 + 1;
if(jobTypeInt >= 50)
job_type = IO_bound;
else
job_type = CPU_bound;
required = rand() % 10;
job *newJob = new job(id, job_type, inWQ, outWQ, inCPUQ, outCPUQ, required, given);
waitQueue.push(*newJob);
}

while((CPUqueue.size() <= 10) && waitQueue.empty() == false)
{
waitQueue.front();
job temp = waitQueue.back();
waitQueue.pop();
temp.setTimeExitedWQueue(clock);
temp.setTimeEnteredCPUQueue(clock);
CPUqueue.push(temp);
}

double oneSecond = 1.0, timeSpent = 0;

while((oneSecond > 0.0) && (!CPUqueue.empty()))
{
job top = CPUqueue.front();
CPUqueue.pop();
if(top.getJobType() == IO_bound)
{
top.setTimeGiven(top.getTimeGiven() + .1);
timeSpent = .1;
numIO++;
}
else
{
top.setTimeGiven(top.getTimeGiven() + .2);
timeSpent = .2;
numCPU++;
}

if(top.getTimeRequired() <= top.getTimeGiven())
{
top.setTimeExitedCPUQueue(clock);
jobsCompleted++;

timeSpentInWaitQueue += (top.getTimeExitedWQueue() - top.getTimeEnteredWQueue());
timeSpentInCPUqueue += (top.getTimeExitedCPUQueue() - top.getTimeEnteredCPUQueue());
}
else
CPUqueue.push(top);
oneSecond -= timeSpent;

if((clock%60 == 0) && (clock > 600)) //every 60 seconds after the first 10 minutes
{
cout << "After the first 10 minutes:" << endl;
cout << "Time: " << clock << endl;
cout << "Number of jobs in the wait queue: " << waitQueue.size() << endl;

cout << "Number of jobs in the CPU queue: " << CPUqueue.size() << endl;
job temp1 = waitQueue.front();
job temp2 = CPUqueue.front();
cout << "Job number of front wait job: " << temp1.getID() << endl;
cout << "Job number of front CPU job: " << temp2.getID() << endl;
}
else
{
cout << "Job Number: " << jobsCompleted << endl;
cout << "Job ID: " << top.getID() << endl;
cout << "Job Type: " << top.getJobType() << endl;
cout << "Time in CPU Queue: " << timeSpentInCPUqueue << endl;
cout << "Time Entered CPU Queue: " << top.getTimeEnteredCPUQueue() << endl << endl;
}
}

if((oneSecond > 0) && (CPUqueue.empty()))
CPUidle += oneSecond;
}
}
cout << "I/O_bound jobs: " << numIO << endl;
cout << "CPU_bound jobs: " << numCPU << endl;
cout << "*****JOBS COMPLETED: " << jobsCompleted << " *****" << endl << endl;

return 0;
}

И как менее актуальный вопрос, я не могу заставить мои перечисленные типы данных распечатываться правильно, ни мои идентификаторы в самом начале, чтобы перейти в *newJob правильно…

0

Решение

Скажем, это было зацикливание некоторое время и сейчас jobsCompleted 499 (и ваш jobsToComplete это 500). Итак, это последний цикл, верно? Да! Но увеличение jobsCompleted происходит в другом вложенном while петля. Так что, если этот вложенный цикл происходит 6 раз, jobsCompleted будет 505, а затем завершится внешний цикл while, в результате чего вы получите общее количество выполненных заданий на 505.

Чтобы понять, как это исправить, нужно понять логику вашего кода, но я слишком многого не могу понять. Может быть, это поможет вам.

5

Другие решения

Из кода видно, что это происходит из-за ситуации, подобной следующей

while (x < y) {
...
while (condition) {
...
if (condition) {
++x;
}
}
}

Это означает, что для каждой внешней итерации может случиться, что вы увеличиваете x более одного раза, поэтому вы вводите последнюю итерацию (x == 499), а затем увеличить его 6 раз, пока он находится внутри внутреннего цикла. Вы должны отладить эту часть кода, чтобы понять, почему это происходит, явно вы должны проверить эти два условия:

while((oneSecond > 0.0) && (!CPUqueue.empty()))
if(top.getTimeRequired() <= top.getTimeGiven())

потому что на последней итерации оба они верны как минимум 6 раз.

1

По вопросам рекламы [email protected]