Параллельная резьба C # в ThreadPool - PullRequest
0 голосов
/ 01 марта 2012

Я рассматриваю следующие методы распределения потоков между многоядерными процессорами для выполнения задач, однако в диспетчере задач Windows было показано использование только одного конкретного ядра.Как сделать это параллельно для этих 5 потоков?

private void ActivateProcess
{
   ...
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker1));
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker2)); 
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker3));
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker4));
   ThreadPool.QueueUserWorkItem(new WaitCallback(Worker5));
}

...

private void Worker1(Object stateInfo)
{
    try
    {
        //for (int i = 0; i < _NumberOfLoop; i++)
        Parallel.For(0,(long)_NumberOfLoop, i =>
        {
            if (_ForceToStop)
                throw new System.ArgumentException(
                    "Force stop at WorkerThread 1", "Aborted");

            // Process: Process a tasks
            ...
        });

    }
    catch (Exception ex)
    {
        ...
    }
}

1 Ответ

1 голос
/ 01 марта 2012

Трудно сказать по этому коду.У вас даже есть два уровня параллелизма, так что «оно должно работать».

Ответ должен быть в // Process: Process a tasks - он, вероятно, зависает на общем необщем ресурсе.код в «задачах» является независимым и требует интенсивной работы процессора, поэтому вы должны видеть, что все ваши ядра заняты.Но когда вы, например, попытаетесь смоделировать это с помощью Sleep (), вы не увидите, что что-то происходит в TaskManager.

...