public static IEnumerable <Job> AssignJobs(int threadCount, long[] jobs) { long currentTime = 0; var queue = new MinBinaryHeap <Job>(threadCount); var initials = new Queue <int>(Enumerable.Range(0, threadCount)); //Process Results var results = new List <Job>(); int id; foreach (var processingTime in jobs) { var q = queue.Max(); if (initials.Count > 0 && (q == null || q.EndOfProcessing > currentTime)) { //Add job as un used initial thread id = initials.Dequeue(); } else { queue.ExtractMax(); currentTime = q.EndOfProcessing; id = q.ThreadId; } var job = new Job(id, currentTime, processingTime); results.Add(job); queue.Insert(job); } return(results); }
public static IEnumerable <Job> AssignJobs(int threadCount, long[] jobs) { long currentTime = 0; var queue = new MinBinaryHeap <Job>(threadCount); var initials = new Queue <int>(Enumerable.Range(0, threadCount)); //Process Results var results = new List <Job>(); int id; foreach (var processingTime in jobs) { var q = queue.Max(); if (initials.Count > 0 && (q == null || q.EndOfProcessing > currentTime)) { //Process job on unused thread //Do not Dequeue max since it does not exist or has not finished processing yet id = initials.Dequeue(); } else { //Dequeue Max and use that thread to process new job queue.ExtractMax(); currentTime = q.EndOfProcessing; id = q.ThreadId; } //adding job now since reporting on start time not end of processing time var job = new Job(id, currentTime, processingTime); results.Add(job); queue.Insert(job); } return(results); }