【问题标题】:c - progress for each threadc - 每个线程的进度
【发布时间】:2018-09-25 03:05:46
【问题描述】:

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

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

【问题讨论】:

    标签: c multithreading pthreads progress


    【解决方案1】:

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

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

    然后主线程可以偶尔锁定互斥体,遍历数组sum_runner_structs 以打印出每个线程的current_index 值,并计算所有值的总和以进行全局进度计算,然后解锁互斥锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多