2013-03-02 46 views
2

我是Pthread編程的新手。如何在簡單的Pthread編程中分配數組變量?

我一直在嘗試像下面這段代碼這樣一種非常簡單的方式使用Pthread,並且它在我的CodeBlock中運行良好,因爲我已經包含了dll和bin文件。

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

void *printNumber(void *x); 

int main(){ 
    pthread_t threadA, threadB, threadC, threadD; 
    pthread_create(&threadA, NULL, printNumber, (void *)"Sponge"); 
    pthread_create(&threadB, NULL, printNumber, (void *)"Star"); 
    pthread_create(&threadC, NULL, printNumber, (void *)"Squid"); 
    pthread_create(&threadD, NULL, printNumber, (void *)"Crab"); 
    pthread_exit(NULL); 
    return 0; 
} 

void *printNumber(void *x){ 
    char* id = (char*)x; 
    int i; 
    for(i=0;i<100;i++){ 
     printf("Thread %s: printing integer value %i\n", id, i); 
    } 
    pthread_exit(NULL); 
} 

然後我編寫另一個簡單的程序,使用Pthread將2個數組(arrayA + arrayB)添加到arrayC中。 這是我的簡單代碼。 所有東西都是硬編碼的,沒有循環,並且在main()中也是這樣,因爲我想盡可能簡單地理解如何創建單個Pthread。

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

#define SIZE 16 
#define UPPER_RAND 100 
#define NUM_THREADS 4 

// HEADER PROCEDURES  
void randomGenerator(int arr[]); 
void printArray(int arr[]); 
void *addArrayPthread(void *x); 

typedef struct { 
    int startIdx; 
    int arrC[SIZE], arrA[SIZE], arrB[SIZE]; 
} someType; 

int main(){ 
    printf("A Simple Program To Add Arrays Using PThread\n"); 
    int arrayA[SIZE]; 
    int arrayB[SIZE]; 
    int arrayC[SIZE]; 

    randomGenerator(arrayA); 
    printArray(arrayA); 

    randomGenerator(arrayB); 
    printArray(arrayB); 

    someType *w,*x,*y,*z; 
    w = (someType*) malloc(sizeof(someType)); 
    x = (someType*) malloc(sizeof(someType)); 
    y = (someType*) malloc(sizeof(someType)); 
    z = (someType*) malloc(sizeof(someType)); 

    (*w).startIdx = 0; 
    (*w).arrA = arrayA; 
    (*w).arrB = arrayB; 
    (*w).arrC = arrayC; 

    (*x).startIdx = 4; 
    (*x).arrA = arrayA; 
    (*x).arrB = arrayB; 
    (*x).arrC = arrayC; 

    (*y).startIdx = 8; 
    (*y).arrA = arrayA; 
    (*y).arrB = arrayB; 
    (*y).arrC = arrayC; 

    (*z).startIdx = 12; 
    (*z).arrA = arrayA; 
    (*z).arrB = arrayB; 
    (*z).arrC = arrayC; 


    pthread_t threadA, threadB, threadC, threadD; 
    pthread_create(&threadA, NULL, addArrayPthread, (void *)w); 
    pthread_create(&threadB, NULL, addArrayPthread, (void *)x); 
    pthread_create(&threadC, NULL, addArrayPthread, (void *)y); 
    pthread_create(&threadD, NULL, addArrayPthread, (void *)z); 

    pthread_join(threadA, NULL); 
    pthread_join(threadB, NULL); 
    pthread_join(threadC, NULL); 
    pthread_join(threadD, NULL); 

    return 0; 
} 


//=====================================================================================// 

void randomGenerator(int arr[]){ 
    printf("Generating random value for the array...\n"); 
    int i; 
    for (i=0;i<SIZE;i++){ 
     arr[i] = (rand() % UPPER_RAND); 
    } 
} 

void printArray(int arr[]){ 
    printf("Display the array value...\n"); 
    int i; 
    printf("["); 
    for (i=0;i<SIZE;i++){ 
     printf("%i, ",arr[i]); 
    } 
    printf("]\n"); 
} 

void *addArrayPthread(void *x){ 
    someType *p = (someType *) x; 
    printf("Adding to arrays, starting from index #%i\n",(*p).startIdx); 
    int blockSize = SIZE/NUM_THREAD; 
    int end = (*p).startIdx + blockSize; 
    int i; 
    for (i=(*p).startIdx;i<end;i++){ 
     (*p).arrC[i] = (*p).arrA[i] + (*p).arrB[i]; 
    } 
} 

我圍繞這些線12個的錯誤消息: (* X)= .arrA arrayA;和這樣的

||In function `int main()':| 
\pth_array.c|58|error: ISO C++ forbids assignment of arrays| 

這裏是我的問題:

  1. 爲什麼陣列的禁分配新建分配FY?以及如何解決它?
  2. 在上面的第一個程序中,我把pthread_exit(NULL)兩次:在 main()和void *函數中。我想我只需要把它放一次。那麼我到底要把它放在哪裏呢?在main()或void *函數中?
  3. 是否必須在返回0之前在main()中放入pthread_join

在此先感謝您。 你的解釋對我來說是一個很大的幫助。

感謝

P.S:我在下面的章節後另一個類似的問題(約矩陣)。

+0

OT:有' - >'運算符。 – alk 2013-03-02 17:55:33

+0

@alk:我明白了。謝謝。 – izza 2013-03-03 00:24:39

+0

編譯器抱怨數組不允許在賦值運算符的右側。你想用每個標記的代碼行來做什麼? – 2013-03-03 00:29:19

回答

0

好,

  1. 你不允許直接在C.複製陣列已經說明here相當不錯。
  2. pthread_exit的確切功能明確說明here;例子也可用here。也就是說,調用應該放在printNumber(void * x)中,而不是放在main()中。
  3. pthread_join的確切功能明確說明here。所以要將控制權交給線程,pthread_join調用是必需的。
+1

@ Roney Michael:感謝您的鏈接。看起來我還沒有學習基礎C語言程序設計101. – izza 2013-03-02 16:56:52

+1

我想提出上面的2個答案,這對我來說非常有幫助,但是我仍然沒有這樣的聲望,對不起。在我獲得足夠的聲望後,我會晚點起來。 ;) – izza 2013-03-02 19:31:31

3

什麼類似:需要

typedef struct { 
    int startIdx; 
    int *arrC, *arrA, *arrB; 
} someType; 

[...] 

x->arrA = arrayA 
[...] 

在pthread_join因爲要等待每一個線程退出應用程序之前完成。

+1

@ Anthony Catel:在我看到您的答案之前,我正在考慮根據我發現的鏈接(computational.engineering.or.id/Matrix/Perkalian)中的示例更改我的結構,如下所示:typedef struct {int startIdx ; int(* arrC)[SIZE],(* arrA)[SIZE],(* arrB)[SIZE]; } someType;但是你的建議似乎更容易理解。謝謝。 – izza 2013-03-02 17:28:57

+1

@ Anthony Catel:你的建議工作得很好...... !!!非常感謝:D。我現在要用Pthread編寫一個矩陣mult。 – izza 2013-03-02 17:34:54

相關問題