c - 每个线程的进度

c - progress for each thread

我有一个程序,它使用 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);
    }
}

我想显示每个线程的进度(也许是百分比?),然后我可以根据每个线程的进度计算总体进度。我不知道如何为每个线程实现进度,我怎么能这样做呢?

一种方法是添加一个全局互斥锁,然后向您的 sum_runner_struct.

添加一个新的成员变量,例如 long long current_index

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

然后主线程可以偶尔锁定互斥量,遍历数组 sum_runner_structs 以打印出每个线程的 current_index 值,并计算所有值的总和global-progress计算,然后解锁mutex。