2016-04-13 35 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

你是我的英雄! –