Многопоточные массивы - PullRequest
       3

Многопоточные массивы

0 голосов
/ 25 марта 2012

У меня есть счетчик потоков pCount, и у меня есть массив float []. Я хочу получить указатель на массив, а затем на основе pCount создать столько потоков и заполнить массив данными.

fixed (float* pointer = array)
{
    IntPtr fPtr = new IntPtr(pointer);

    for (int i = 0; i < pCount; i++)
    {
        Thread t = new Thread(() => ThreadMethod(fPtr, blockWidth, blockHeight, xIndex)));
        t.Start();
    }
}


private unsafe void ThreadMethod(IntPtr p, int blockWidth, int blockHeight, int startX)
{
    Random RandomGenerator = new Random();
    for (int x = startX; x < startX + blockWidth * blockHeight; x++)
    {
        ((float*)p)[x] = ((float)(RandomGenerator.NextDouble()) - 0.5f) * 2.0f;
    }
}

Так что, если массив был 1000x1000, и у меня 4 потока, я хочу, чтобы поток 1 заполнял данные от 0 до 250, затем поток 2 от 250 до 500, поток 3 от 500 - 750 и поток 4 от 750 - 1000.

Но способ, который я описал там, не работает. Кто-нибудь может помочь?

1 Ответ

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

Нет необходимости использовать арифметику указателей для доступа к массиву в C #. Вот упрощенный пример того, как это можно сделать:

public void ParalellizeArrayFill(int threadCount, float[] array)
{
    if (array == null || array.Length == 0)
        throw new ArgumentException("Array cannot be empty");

    if (threadCount <= 1)
        throw new ArgumentException("Thread count should be bigger than 1");

    int itemsPerThread = array.Length / threadCount;
    for (int i = 0; i < threadCount; i++)
    {
        Thread thread = new Thread( (state) => FillArray(array, i*itemsPerThread, itemsPerThread));
        thread.Start();
    }  
}

private void FillArray(float[] array, int startIndex, int count)
{
    for (int i = startIndex; i < startIndex + count; i++)
    {
        // init value
        array[i] = value; 
    }
}

Есть несколько предостережений, о которых следует знать. Прежде всего, ваше деление может не делиться поровну (например, 500/3), поэтому вы должны разобраться с этим делом. Кроме того, вам не нужно использовать арифметику указателей, поскольку массив уже передан по ссылке и доступен по индексу.

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