2017-05-21 2 views
1
#include<pthread.h> 
#include<stdio.h> 
#include<stdlib.h> 
#define NUM_THREADS 4 

int arraySum = 0; 
int array[] = {20, 18, 16, 14, 12, 10, 8, 6, 4, 2, -10, -20, -30, -40, 15, 23, 25, 75, 45, 33}; 
int low = 0; 
int high = 4; 

// Function that calculates sum of 5 elements of an array 
void *ArraySum(void *threadid) 
{ 
    // Iterating from index low to high 
    for(int i = low; i < high; i++) 
    { 
     // Accumulating array sum 
     arraySum = arraySum + array[i]; 
    } 
    // Updating lowest and highest index 
    low = low + 5; 
    high = high + 5; 
    // Exiting current thread 
    pthread_exit(NULL); 
} 
// Main function 
int main(int argc, char *argv[]) 
{ 
    int rc, t; 
    // Creating thread array 
    pthread_t threads[NUM_THREADS]; 
    // Iterating over each thread 
    for(t = 0; t < NUM_THREADS; t++) 
    { 
     // Creating a thread 
     rc = pthread_create(&threads[t], NULL, ArraySum, &t); 
     // Checking for status 
     if(rc) 
     { 
     printf(" Error; return code from pthread_create() is %d \n", rc); 
     exit(-1); 
     } 
    } 
    /* Waiting till all threads finish their execution */ 
    for (t = 0; t < NUM_THREADS; t++) 
    { 
     pthread_join(threads[t], NULL); 
    } 
    // Printing Array sum 
    printf("\nArray Sum: %d \n", arraySum); 
    pthread_exit(NULL); 
} 

目的は、4つの異なるスレッドを作成し、配列内のすべての数値を一緒に追加することです。たとえば、最初のスレッドは最初の5つの数値(20 + 18 + 16 + 14 + 12)を追加します。 2番目のスレッドは次の5個を追加します。Cで異なるスレッドを合計していますか?

私はそれを実行すると合計164を取得しますが、私は211を期待しています。私は4つの異なるスレッドを作成し、それらを正しく結合しましたが、出力が間違っていると思います。

+1

ワーカースレッド間の同期はまったくありません。 'low'や' arraySum'のような共有値は、すべてのスレッドが非制御/非同期で読み書きしているので、どのように予測可能な値を取ると思いますか? – kaylum

答えて

0

ここでは、さまざまなスレッドを合計するという解決策を書いています。私は基本的に各スレッドの開始/終了インデックスを決定するためにスレッドIDを使用します。したがって、各スレッドは部分和を計算するため、同期の必要はありません。スレッドが終了すると、その部分合計が返され、最終的な合計に累積されます。

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

#define NUM_THREADS 4 

int array[] = {20, 18, 16, 14, 12, 10, 8, 6, 4, 2, -10, -20, -30, -40, 15, 23, 25, 75, 45, 33}; 

// Function that calculates sum of 5 elements of an array 
void *ArraySum(void *arg) 
{ 
    int id = (int)arg; 
    int partial_sum = 0; 
    int begin = id * (NUM_THREADS + 1); 
    int end = id * (NUM_THREADS + 1) + NUM_THREADS; 

    // Iterating from index low to high 
    for(int i = begin; i <= end; i++) 
    { 
     // Accumulating array partial sum 
     partial_sum += array[i]; 
    } 
    // Exiting current thread 
    pthread_exit((void *)partial_sum); 
} 
// Main function 
int main(int argc, char *argv[]) 
{ 
    int rc, t; 
    int arraySum = 0; 
    void *retvalue; 

    // Creating thread array 
    pthread_t threads[NUM_THREADS]; 

    // Iterating over each thread 
    for(t = 0; t < NUM_THREADS; t++) 
    { 
     // Creating a thread 
     rc = pthread_create(&threads[t], NULL, ArraySum, (void *)t); 
     // Checking for status 
     if(rc) 
     { 
      printf(" Error; return code from pthread_create() is %d \n", rc); 
      exit(-1); 
     } 
    } 
    /* Waiting till all threads finish their execution */ 
    for (t = 0; t < NUM_THREADS; t++) 
    { 
     pthread_join(threads[t], &retvalue); 
     arraySum += (int)retvalue; 
    } 
    // Printing Array sum 
    printf("\nArray Sum: %d \n", arraySum); 
    pthread_exit(NULL); 
} 
+0

助けてくれてありがとう。あなたがプロセスIDで行ったことを理解しています。これはトンに役立ちます! – ninchicken

+0

いいえ、それは私が約2年前に大学で対処しなければならなかった運動です...投票することを忘れないでください:) – Vic

関連する問題