0

コマンドラインから数値のリストを取得し、個別のワーカースレッドを使用して平均、合計などのさまざまな統計値を計算するマルチスレッドプログラムを作成しようとしています。このプログラムで 3 つのスレッドを作成し、コンパイルしますが、エラーが発生します。私は C とスレッド プログラミングに不慣れです。計算のためにデータをスレッドに渡す方法を教えてください。これは私のコードです:

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

#define NUM_THREAD 3

int average, min, max;

void *
doSomeThing(void *param)
{

    //int *id_ptr, taskid;
    int *argv = (int *) param;
    sleep(1);
    //id_ptr=(int *) threadid;
    //taskid= *id_ptr;
    int j;
    int sum = 0;
    int upper = atoi(param);

    sleep(1);
    pthread_t id = pthread_self();

    unsigned long i = 0;


    if (id = 1) {
        int i;
        for (i = 0; i < upper; i++) {
            sum += argv[i];
        }
        printf("sum of no's is :\n", sum);
    }
    if (id = 2) {
        printf("\n Second thread processing\n");
    }
    if (id = 3) {
        printf("\n Third thread processing\n");
    }

    for (i = 0; i < -1; i++);
    {
        pthread_exit(NULL);
    }
}

int
main(int argc, char *argv[])
{
    pthread_t threads[NUM_THREAD];
    pthread_attr_t attr;
    int *taskid[NUM_THREAD];
    int i = 0;
    int t;
    int err;
    //int input,a;
    if (argc != 2) {
        fprintf(stderr, "usage: a.out <integer value>\n");
        return -1;
    }
    /*
    printf("how many no's do u want to evaluate?:\n");
    scanf("%d", &input);
    printf("Enter the no's:\n");
    for (a = 0; a < input; a++) {
        arr[a] = (int) malloc(sizeof(int));
        scanf("%d", &arr[a]);
        printf("data:", &arr[a]);
    }
    */
    pthread_attr_init(&attr);
    for (t = 0; t < NUM_THREAD; t++) {
        taskid[t] = (int *) malloc(sizeof(int));
        *taskid[t] = t;
        printf("In main: creating thread %d\n", t);
        err = pthread_create(&threads[t], &attr, doSomeThing, argv[1]);

        if (err) {
            printf("Error; return code from pthread_create() is %d\n",
                   err);
            exit(-1);

        }
    }
    for (t = 0; t < NUM_THREAD; t++) {
        pthread_join(threads[t], NULL);
        printf("Joining thread %d\n", t);
    }
    pthread_exit(NULL);
}
4

1 に答える 1

0

pthread_create1、2、3 のような小さい数字を thread_id として割り当てる理由は何だと思いますか? を呼び出すとpthread_self()、1、2、または 3 を取得する可能性は低くなります。また、最終的freeには から取得したメモリを取得する必要がありますmalloc

私の提案は、1 つの関数を使用してすべてを行うのではなく、平均、最大、および最小に対して個別の関数を作成し、pthread_create を明示的に 3 回呼び出して 3 つの個別の関数を渡すことです。

于 2013-10-11T20:04:25.117 に答える