c - прогресс для каждого потока - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть программа, которая принимает n чисел, которые генерируют сумму каждого числа от 0 до N .Для каждого заданного числа создается новый поток:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

struct sum_runner_struct {
    long long limit;
    long long answer;
};

// Thread function to generate sum of 0 to N
void* sum_runner(void* arg)
{
    struct sum_runner_struct *arg_struct = (struct sum_runner_struct*) arg;

    long long sum = 0;
    for (long long i = 0; i <= arg_struct->limit; i++) 
    {
        sum += i;
    }

    arg_struct->answer = sum;
    pthread_exit(0);
}

int main(int argc, char **argv)
{
    if (argc < 2) 
    {
        printf("Usage: %s <num 1> <num 2> ... <num-n>\n", argv[0]);
        exit(-1);
    }
    int num_args = argc - 1;

    struct sum_runner_struct args[num_args];

    // Launch thread
    pthread_t tids[num_args];
    for (int i = 0; i < num_args; i++) 
    {
        args[i].limit = atoll(argv[i + 1]);
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&tids[i], &attr, sum_runner, &args[i]);
    }

    // Wait until thread is done its work
    for (int i = 0; i < num_args; i++) 
    {
        pthread_join(tids[i], NULL);
        printf("Sum for thread %d is %lld\n", i, args[i].answer);
    }
}

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

1 Ответ

0 голосов
/ 25 сентября 2018

Один из способов сделать это - добавить глобальный мьютекс и добавить новую переменную-член, такую ​​как long long current_index, к вашему sum_runner_struct.

Время от времени (например, возможно, один раз в 1 миллион итерацийцикл for?), каждый поток затем блокирует мьютекс, устанавливает arg_struct->current_index=i;, а затем разблокирует мьютекс.

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

...