2013-03-02 45 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

相关问题