c-每个线程的进度

时间:2018-09-25 03:05:47

标签: c multithreading pthreads progress

我有一个使用 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 :(得分:1)

一种方法是添加一个全局互斥体,然后向long long current_index中添加一个新的成员变量,例如sum_runner_struct

每隔一段时间(例如,for循环每百万次迭代一次?),每个线程就会锁定互斥锁,设置arg_struct->current_index=i;,然后解锁互斥锁。

然后,主线程可能偶尔会锁定互斥锁,在数组sum_runner_structs上进行迭代以打印出每个线程的current_index值,并计算出全局变量的所有值之和进行计算,然后解锁互斥锁。