Пример #1
0
    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);
    }
Пример #2
0
    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);
    }