我有两个问题。
首先
我需要逐渐创建线程块,而不是一些最大值,例如20.
例如,前20个线程进入,作业完成,只有20秒线程进入,依此类推。
作业总数可能比线程总数大得多(在我们的示例中为20),但线程总数不应大于我们的最大值(在我们的示例中为20)。
第二
可以连续添加线程吗?例如,20个线程,一个线程作业完成,我们看到线程总数是19,但我们的最大值是20,所以我们可以再创建一个线程,还有一个线程去:) :( / p>
因此,我们不会浪费时间等待另一个线程工作完成,我们的总线程数不会大于我们的最大值(在我们的示例中为20) - 听起来很酷。
结论:
对于总速度,我认为第二种变体会更快更好,如果你帮助我,我会非常优雅,但也会告诉你如何做第一种变体。
这是我的代码(它没有正常工作,结果很奇怪 - 在循环中的十一步之后some_array元素变得错误,类似这样:线程计数器= 32748):
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <math.h>
#define num_threads 5 /* total max number of threads */
#define lines 17 /* total jobs to be done */
/* args for thread start function */
typedef struct {
int *words;
} args_struct;
/* thread start function */
void *thread_create(void *args) {
args_struct *actual_args = args;
printf("Thread counter = %d\n", *actual_args->words);
free(actual_args);
}
/* main function */
int main(int argc, char argv[]) {
float block;
int i = 0;
int j = 0;
int g;
int result_code;
int *ptr[num_threads];
int some_array[lines] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
pthread_t threads[num_threads];
/* counting how many block we need */
block = ceilf(lines / (double)num_threads);
printf("blocks= %f\n", block);
/* doing ech thread block continuously */
for (g = 1; g <= block; g++) {
//for (i; i < num_threads; ++i) { i < (num_threads * g),
printf("g = %d\n", g);
for (i; i < lines; ++i) {
printf("i= %d\n", i);
/* locate memory to args */
args_struct *args = malloc(sizeof *args);
args->words = &some_array[i];
if(pthread_create(&threads[i], NULL, thread_create, args)) {
free(args);
/* goto error_handler */
}
}
/* wait for each thread to complete */
for (j; j < lines; ++j) {
printf("j= %d\n", j);
result_code = pthread_join(threads[j], (void**)&(ptr[j]));
assert(0 == result_code);
}
}
return 0;
}