Многопоточность: когда начинать и выходить из потоков - PullRequest
1 голос
/ 16 сентября 2011

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

То, что я сделал до сих пор, - это чтение во входном файле и присвоение всех целых чисел массиву. Затем я разделил общее число целых чисел ( index ) на количество потоков ( number_of_threads ), чтобы найти оптимальное numbers_per_thread .

Затем я создаю цикл while для приращения всех чисел в массиве, назначая каждый блок чисел в соответствии с оптимальным numbers_per_thread .

prob_5.c

#include <stdio.h>

int main(int argc, char *argv[]) {
int i, j;
FILE *fp;
int values[15000];
char line[32];
int index = 0;
int number_of_threads = 10;
int numbers_per_thread;

for (i = 1; i < argc; i++) {
    fp = fopen(argv[i], "r");

    if (fp == NULL) {
        fprintf(stderr, "cat: can't open %s\n", argv[i]);
        continue;
    }

    while (fgets(line, sizeof(line), fp) != NULL && (index < 15000)) {
        sscanf(line, "%d", &values[index]);
        index++;
    }

    fclose(fp);
}

numbers_per_thread = index / number_of_threads;

while (i < index) {
    for (j = 0; (j < numbers_per_thread) && (i < index); j++) {

        i++;
        j++;
    }
}

printf("%d\n", index);

return 0;
}

Я не совсем понимаю, как мне следует обрабатывать запуск и остановку потоков. Должен ли я запустить его внутри цикла for (j = 0; ..), а затем создать if (j == numbers_per_thread) для завершения потока? Должен ли я создать новый массив для размещения блока чисел для каждого потока? Я думаю, я просто запутался в том, как использовать pthread_create, pthread_join и т. Д., Так как я впервые пытаюсь их использовать.

1 Ответ

0 голосов
/ 16 сентября 2011

Я бы сделал массив из pthread_t значений для хранения идентификатора каждого создаваемого вами потока. Создайте их в цикле после прочтения массива значений, а затем немедленно выполните другой цикл, чтобы объединить их все. После этого вы можете взять отдельные неполные суммы и сложить их вместе, чтобы получить окончательную сумму.

...