我有一个使用 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);
}
}
我想显示每个线程的进度(也许以百分比显示?),从那里我可以根据给定的每个线程进度来计算总体进度。我不知道如何实现每个线程的进度,我该怎么做呢?
答案 0 :(得分:1)
一种方法是添加一个全局互斥体,然后向long long current_index
中添加一个新的成员变量,例如sum_runner_struct
。
每隔一段时间(例如,for循环每百万次迭代一次?),每个线程就会锁定互斥锁,设置arg_struct->current_index=i;
,然后解锁互斥锁。
然后,主线程可能偶尔会锁定互斥锁,在数组sum_runner_structs
上进行迭代以打印出每个线程的current_index
值,并计算出全局变量的所有值之和进行计算,然后解锁互斥锁。