Объект, созданный отдельно разными потоками, все еще используется совместно - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть программа, в которой я хочу смоделировать очередь.Чтобы ускорить процесс (множество разных параметров), я подумал, что я мог бы использовать параллельный цикл, однако объект очереди (или, по крайней мере, объекты в этом объекте) по-прежнему используются совместно, хотя все они создаются либо в функции MGcC, либо в очереди.объект.Что-то я забыл о параллельных функциях?

Объект, который создает проблему, это очередь. MyHeap.

(Также, если вам нужна дополнительная информация, пожалуйста, спросите, так как я упустил много, чтобы сделать ее более читабельной, как вы можете видеть в объекте очереди).

Parallel.ForEach(a, (numbers) =>
{                   
    MGcC(a);
});        

static public Tuple<Customer[,], List<Interval>[]> MGcC(int a)
{
    Queue queue = new Queue(a);
    return queue.Simulate(writeFile);
}

public class Queue
{
    Func<object, double> arrivalFunction;
    Func<object, double> servingFunction;
    double lambda;
    double v;
    object serviceObject;
    int minServers;
    bool decision;

    int idleServers;
    int activeServers;
    int amountInOrbit;
    protected minHeap myHeap;

    public Queue(double lambda, double v, object serviceObject, int servers, Func<object, double> arrivalFunction, Func<object, double> servingFunction, bool decision = false)
    {
        this.arrivalFunction = arrivalFunction;
        this.servingFunction = servingFunction;
        this.lambda = lambda;
        this.v = v;
        this.serviceObject = serviceObject;
        this.minServers = servers;
        this.decision = decision;

        idleServers = servers;
        activeServers = 0;
        amountInOrbit = 0;
        myHeap = new minHeap();
    }

public class minHeap
{
    static protected Action[] heap;
    static public int counter;
    public minHeap()
    {
        counter = -1;
        heap = new Action[1000000];
    }

    public Action Pop()
    {
        if (counter < 0)
        {
            Console.WriteLine("empty");
            return new Action(0, 0, new Customer());
        }
        Action returnValue = heap[0];
        heap[0] = heap[counter];
        counter--;
        heapify(0);
        return (returnValue);
    }

    public void Push(Action a)
    {
        counter++;
        heap[counter] = new Action(double.PositiveInfinity, 0, new Customer());
        InsertKey(counter, a);
    }

    static void InsertKey(int i, Action a)
    {
        if (heap[i].TimeOfExecution < a.TimeOfExecution)
            Console.WriteLine("should not have happened");
        heap[i] = a;
        while (i > 0 && heap[Parent(i)].TimeOfExecution > heap[i].TimeOfExecution)
        {
            Action temp = heap[i];
            heap[i] = heap[Parent(i)];
            heap[Parent(i)] = temp;
            i = Parent(i);
        }
    }

1 Ответ

0 голосов
/ 26 ноября 2018

Все поля для вашего minHeap типа static.Так что да: они общие - вот что означает static.Вы, вероятно, хотите сделать их не static.

Возможно, вы использовали static, когда имели в виду readonly?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...