Динамическое распределение работы между потоками через очередь - PullRequest
0 голосов
/ 15 мая 2011

Хорошо, у меня возникла проблема с динамическим распределением работы между потоками в очереди.

Например, в моем коде есть структура, подобная приведенной ниже:

struct calc
{
    double num;
    double calcVal;
};

Я храню каждую структуру в массиве длины l, как показано ниже.

struct calc **calcArray; 

/* then I initialize the calcArray to say length l and 
   fill each calc struct with a num*/

Теперь, основываясь на num, я хочу найти значение calcVal. Каждый struct calc имеет различное значение для num.

Я хочу создать 4 pthreads, что достаточно просто, но я хочу сделать это в начале,

поток 0 получает calcArray [0]
поток 1 получает calcArray [1]
поток 2 получает calcArray [2]
поток 3 получает calcArray [3]

Теперь, предполагая, что для каждого потока потребуется разное время, чтобы выполнить вычисления для каждого вычисления,

если поток 1 завершится первым, он получит calcArray [4]

затем поток 3 завершает работу и получает calcArray [5] для выполнения

, и это продолжается, пока не достигнет конца calcArray [l].

Я знаю, что мог бы просто разбить массив на l / 4 (каждый поток получает четверть вызовов), но я не хочу этого делать. Вместо этого я хочу сделать работу как очередь. Есть идеи, как это сделать?

1 Ответ

1 голос
/ 15 мая 2011

Вы могли бы сделать это довольно легко, создав переменную, содержащую индекс следующего элемента, который будет назначен, и затем защитив его мьютексом.

Пример:

// Index of next element to be worked on
int next_pos;

// Mutex that secures next_pos-access
pthread_mutex_t next_pos_lock;

int main() {
    // ...

    // Initialize the mutex before you create any threads 
    pthread_mutex_init(&next_pos_lock, NULL);

    next_pos = NUM_THREADS;

    // Create the threads

    // ...
}

void *threadfunc(void *arg) {
    int index = ...;

    while (index < SIZE_OF_WORK_ARRAY) {
        // Do your work

        // Update your index
        pthread_mutex_lock(&next_pos_lock);
        index = next_pos;
        next_pos++;
        pthread_mutex_unlock(&next_pos_lock);
    }
}

См. Также: Программирование потоков POSIX - переменные Mutex

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