2017-12-30 32 views
0

私はちょうどpthreadsを使って並列プログラミングを学習し始めました。ですから、学習目的のために、私は2つの整数配列を並列に試しました。私はstruct constructを3つの配列変数a,bおよびcで宣言しました。 abの追加を行い、結果をcに保存したいと思います。ここでpthreadを使った並列プログラミング

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

#define MAX 6 

struct data { 
    int a[MAX]; 
    int b[MAX]; 
    int c[MAX]; 
}; 

void *addition(void *index) { 
    struct data *d1 = (struct data *)index; 
    printf("value of d1 structure=%d\n", d1->a[0]); 
} 

int main() { 
    int i, j, t; 
    struct data *item = NULL; 
    pthread_t threads[MAX]; 

    item = (struct data *)malloc(sizeof *item); 

    printf("enter the value for arrray a\n"); 
    for (i = 0; i < MAX; i++) { 
    scanf("%d", &item->a[i]); 
    } 

    printf("enter the value of array b\n"); 
    for (j = 0; j < MAX; j++) { 
    scanf("%d", &item->b[j]); 
    } 

    for (t = 0; t < MAX; t++) { 
    pthread_create(&threads[t], NULL, addition, (void *)&item); 
    } 
} 

pthread_create()に私は機能のほかに、structureの助けを借りて、3つの引数を渡していたときに、変数abがあるので、私は、機能addition()で配列の追加を追加していない今のようコピーされません。 aを印刷すると私にゴミ値が与えられています。誰でもpthread_create()によって呼び出される関数の引数にstructure変数をコピーする方法を教えてください。

+2

'item'の種類は何の呼び出し? '&item'のタイプは何ですか?あなたがそれを知っているとき、問題は明らかでなければなりません。 –

+1

スレッドが完了すると、処理を同期させるためにいくつかの 'pthread_join()'呼び出しが必要です。また、スレッドが機能していることを示す必要があります。あなたは、6種類のスレッドが6種類の計算を行っている様子を見せていません。彼らはデータへのアクセスを一切制御せずに、同じ計算(6つの追加と割り当て)を行っています。これは(潜在的な)トラブルの大きな原因です。ワークロードが非常に小さいためにスレッドが互いに干渉する可能性がないため、気付かないことがあります。スレッド関数は値を返すべきです - ヌルポインタ。あなたのコンパイラは文句を言うべきです! –

答えて

3

pthread_create機能:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
          void *(*start_routine) (void *), void *arg); 

親切(*arg)argへのポインタであることに注意。 struct data *itemをポインタとして作成し、そのアドレス、つまりポインタへのポインタを渡しています。

pthread_create(&threads[t], NULL, addition, (void *)&item); 

変更

pthread_create(&threads[t], NULL, addition, (void *)item). 
+0

呼び出しを変更する:pthread_create(&threads [t]、NULL、追加、(void *)item。 – Zainab

関連する問題