如何创建线程块?

时间:2015-10-23 21:51:49

标签: c linux multithreading pthreads posix

我有两个问题。

首先

我需要逐渐创建线程块,而不是一些最大值,例如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;
}

0 个答案:

没有答案