我是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|
這裏是我的問題:
- 爲什麼陣列的禁分配新建分配FY?以及如何解決它?
- 在上面的第一個程序中,我把pthread_exit(NULL)兩次:在 main()和void *函數中。我想我只需要把它放一次。那麼我到底要把它放在哪裏呢?在main()或void *函數中?
- 是否必須在返回0之前在main()中放入pthread_join?
在此先感謝您。 你的解釋對我來說是一個很大的幫助。
感謝
P.S:我在下面的章節後另一個類似的問題(約矩陣)。
OT:有' - >'運算符。 – alk 2013-03-02 17:55:33
@alk:我明白了。謝謝。 – izza 2013-03-03 00:24:39
編譯器抱怨數組不允許在賦值運算符的右側。你想用每個標記的代碼行來做什麼? – 2013-03-03 00:29:19