void computePath(Object arg) { int k = 1; bool ok = false; elementQueue eq = (elementQueue)arg; int i = eq.start; int j = eq.end; Console.WriteLine("<-pop Thread Number " + eq.threadNumber + " calls computePath(" + i + "," + j + ")"); while (k <= n && !ok) { if (i != k && j != k) { if (cost[i][j] == cost[i][k] + cost[k][j]) { elementQueue firstTask = new elementQueue(); firstTask.start = i; firstTask.end = k; firstTask.taskType = 1; firstTask.cameFrom = eq.cameFrom + "0"; Produce(firstTask); Console.WriteLine("->push: Thread Number " + eq.threadNumber + " added " + "computePath(" + i + "," + k + ")"); elementQueue secondTask = new elementQueue(); secondTask.start = k; secondTask.end = j; secondTask.taskType = 1; secondTask.cameFrom += eq.cameFrom + "1"; Produce(secondTask); Console.WriteLine("->push: Thread Number " + eq.threadNumber + " added " + "computePath(" + k + "," + j + ")"); //computePath(i, k); //computePath(k, j); ok = true; } } k++; } if (!ok) { Console.WriteLine(j + " "); imperaObject iobj = new imperaObject(); iobj.cameFrom = eq.cameFrom; iobj.value = j; mutexImpera.WaitOne(); imperaList.Add(iobj); mutexImpera.ReleaseMutex(); } //the thread becomes consumator Consume(eq.threadNumber); }
public void showResult() { imperaObject aux = new imperaObject(); for (int i = 0; i < imperaList.Count - 1; i++) { for (int j = i + 1; j < imperaList.Count; j++) { if (imperaList[i].cameFrom.CompareTo(imperaList[j].cameFrom) > 0) { aux = imperaList[i]; imperaList[i] = imperaList[j]; imperaList[j] = aux; } } } Console.WriteLine("Final results:------------------"); Console.Write(x + " "); for (int i = 0; i < imperaList.Count; i++) { Console.Write(imperaList[i].value + " "); } Environment.Exit(0); }