2012-12-06 22 views
0

我正在製作一個時鐘驅動的模擬程序,除其他問題之外,我的主while循環while(jobsCompleted < jobsToComplete)循環的次數比預期/想要的要多。例如,如果我將500分配給jobsToComplete,那麼程序結束時的輸出將告訴我有505個工作已完成。我試圖調試這個問題至少一個小時,但無濟於事。任何幫助表示讚賞。謝謝!while循環循環多次,我指定它

#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; 
} 

而作爲一個不太相關的問題,我不能讓我的枚舉數據類型正確打印出來,也沒有我的ID在非常乞討進入*newJob正確...

+2

'main'中的所有內容?真的嗎? –

回答

5

比方說,它已經循環了一段時間,現在jobsCompleted是499(而你的jobsToComplete是500)。好的,這是最後一個循環了嗎?是!但jobsCompleted的遞增發生在另一個嵌套的while循環內。因此,如果該嵌套循環出現6次,則jobsCompleted將爲505,然後外部while循環將結束,從而使您完成505個作業的總數。

告訴你如何解決這個問題需要了解邏輯你的代碼,但對我來說有點太多了。也許這會幫助你。

+0

我認爲這樣做,謝謝! –

1

通過看代碼很顯然,出現這種情況是因爲你有一個像下面

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

的情況下這意味着,每一個外部循環可能發生,你正在遞增x不止一次,所以你輸入最後一次迭代(x == 499),然後在內循環內增加6次。你應該調試部分代碼,瞭解爲什麼會發生,明確你應該檢查這兩個條件:

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

因爲在最後一次迭代都爲真,至少6倍。