2016-04-13 63 views
1

有些主機可以在locations.get(i)中執行任務。 爲了在它們之間調度任務,首先我尋找空閒主機,如果有空閒主機,我發送task到最快的主機。 但是如果沒有空閒的主機,這個算法開始掛起。我該如何解決它?SimGrid。沒有空閒主機時發現無限循環

for (int i = 0; i < taskCount; i++){ 
    while (true) { 
    ArrayList<Host> hostList = getFreeHost(locations.get(i)); 
     if (!hostList.isEmpty()){ 
      Host destination = getFastestHost(hostList); 
      InstructionTask instructionTask = new InstructionTask(taskName.get(i), compSize.get(i), commSize.get(i), destination.getName()); 
      instructionTask.send(destination.getName()); 
      break; 
     } 
    } 
} 

回答

1

如果沒有空閒主機,則無限循環,因爲在這個精確時間沒有主機會被釋放。如果列表是空的,你想睡一會兒,比如0.1秒。這樣,工作調度過程將以某種方式等待,直到機器被釋放。

一個更好的解決辦法是不依賴於積極的睡眠,我提議,而是利用一個互斥體或東西同步。如果您無法忍受主機獲得免費的時間與調度主機睡眠一段時間後通知的時間之間很少的閒置時間,請這樣做。

+0

你是我的英雄! –