2016-10-14 7 views
0

予想よりも完全に異なる結果をゲットするため、知識の私の不足のためにすみません。私は、スレッドごとにそれぞれ100-199 200-299 300-399と400-499の数を生成する4つのスレッドを作成しようとしています。しかし、2つのint値を持つstruct型のパラメータintervを渡すと、もう一方の側ではまったく異なるものが得られます。 UPDATEDは、スレッドにパラメータを渡すが、私はCに完全に新しいです

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

#define NUM_THREADS 4 
int sum; /* global variable shared by thread(s) */ 
pthread_mutex_t counter_lock = PTHREAD_MUTEX_INITIALIZER; 


int cmpfunc (const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

typedef struct interval { 
    int min; 
    int max; 
} interval; 

void *runner(struct interval *param); /* threads call this function */ 
/* 
* 
*/ 
int main(int argc, char *argv[]) { 
    pthread_t workers[NUM_THREADS]; 
    interval *interv; 
    interv->max = 199; 
    interv->min = 100; 
    /* create the thread */ 
    printf("min = %d max = %d \n",interv->min,interv->max); 
    for (int i = 0; i < NUM_THREADS; i++) { 
     printf("min = %d max = %d \n",interv->min,interv->max); 
     pthread_create(&workers[i],NULL,runner,&interv); 
     interv->min += 100; 
     interv->max += 100; 
     /* wait for the thread to exit */ 
     pthread_join(&workers[i],NULL); 
    } 
    printf("sum = %d\n",sum); 
    return (0); 
} 

/* The thread will begin control in this function */ 
void *runner(struct interval *param) { 
    int n, array[100], list_sum, counter; 
    printf("min = %d max = %d \n",param->min,param->max); 
    for (int i; i < 100; i++) { 
     n = rand() % (param->max + 1 - param->min) + param->min; 
     array[i] = n; 
     list_sum += n; 
    } 
    qsort(array, 100, sizeof(int), cmpfunc); 
    for (int i; i < 100; i++) { 
     counter += 1; 
     if (counter == 10) { 
      counter = 0; 
     } 
    } 
    pthread_mutex_lock(&counter_lock); 
    sum += list_sum; 
    pthread_mutex_unlock(&counter_lock); 
    pthread_exit(0); 
} 

私は100と199に送るたとえば、私は0の代わりに、199を取得し、-13216代わりに100の私は、問題がどこにあるかを正確に確認していない、ここに私のコードですプログラムがコンパイルされたときに期待した結果が得られなかったので、私はほとんどのコードを書き直しました。今、もう一度、私はいくつかの奇妙な振る舞いをしていますが、私はなぜそれがわかりません。

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

#define NUM_THREADS 1 
#define NUM_ELEMENTS 10 
//Sum computed buy the background thread 
int total = 0; 
int counter = 0; 

struct sum_runner_struct { 
    int min; 
    int max; 
    int array[NUM_ELEMENTS]; 
    int answer; 
}; 

//Thread function to generate a sum of 0 to N 
void* runner(void* arg) { 
    struct sum_runner_struct *arg_struct = (struct sum_runner_struct*) arg; 
    int n, sum; 
    for (int i = 0; i<NUM_ELEMENTS; i++) { 
     n = rand()%(arg_struct->max + 1 - arg_struct->min) + arg_struct->min; 
     printf("%d ",n); 
     arg_struct->array[i] = n; 
    } 
    printf("\n"); 
    for (int i = 0; i<NUM_ELEMENTS; i++) { 
     sum = sum + arg_struct->array[i]; 
     printf("%d ", arg_struct->array[i]); 
     counter += 1; 
     if (counter == 10) { 
      printf("\n"); 
      counter = 0; 
     } 
    } 
    printf("Sum: %d\n",sum); 
    arg_struct->answer = sum; 
    pthread_exit(0); 
} 

int main(int argc, char **argv) { 
    int INTERVALS[4][2] = {{100,199},{200,299},{300,399},{400,499}}; 
    struct sum_runner_struct args[NUM_THREADS]; 

    // Launch threads 
    pthread_t tids[NUM_THREADS]; 

    for (int i = 0; i < NUM_THREADS; i++) { 
     args[i].min = INTERVALS[i][0]; 
     args[i].max = INTERVALS[i][1]; 
     //Create attributes 
     pthread_attr_t attr; 
     pthread_attr_init(&attr); 

     //Create Thread 
     pthread_create(&tids[i], &attr, runner, &args[i]); 

    } 

    //Wait until thread is done its work 
    for (int i = 0; i < NUM_THREADS; i++) { 
     pthread_join(tids[i], NULL); 
     printf("Sum of thread %d is %d\n", i, args[i].answer); 
     total += args[i].answer; 
    } 
    printf("Sum is %d\n", total); 
} 

あなたは私の乱数ジェネレータにコメントする前に、私はそれが今のように最善の解決策ではないことを知っているが、それは私の問題ではありません。私の問題は、スレッドの配列に数値を追加したときに、6つの整数だけ大きい数値が得られるときです。なぜこれが起こるのか分かりません。

私はこのようなものになるだろう、私は10個の要素を生成するために、単一のスレッドでプログラムを実行すると例えば:私は二度、したがって同じ配列の2行がある理由のアレイを印刷

133 143 162 129 100 108 152 156 156 119 
133 143 162 129 100 108 152 156 156 119 
Sum: 1364 
Sum of thread 0 is 1364 
Sum is 1364 

RUN SUCCESSFUL (total time: 57ms) 

注意を。あなたが見ることができるように(私はそれらを右に追加したと思います)、配列に数値を追加すると、1364ではなく1358になります。何が原因であるのかわかりません。私は問題を発見した

+1

プロトタイプは、' void *型のランナー(ボイド*のPARAM)でなければなりません。 – mch

+0

注:私は問題を発見したかもしれないが、解決策を見つけることができないと思う。私が引数intervを送信しているときに、私は&intervをポインタへのポインタとして送信していることに気づきます。なぜ値が異なるのでしょうか。 – Malush

+0

あなたがinterv' 'にメモリを割り当てることはありません:私は&削除する場合でも、私は単に RUN FAILED(1S終了値1、合計時間)を取得します。機能ランナーすべての外側が正常に動作しているように見えるので、それは、問題を引き起こしているか – mch

答えて

0

さて、私は正確になぜわからないが、私は のint nを初期化するとき、合計; 何らかの理由で合計値が6に初期化されます。 `;あなたの関数の

関連する問題