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