2013-03-02 2 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); 
} 

А потом я пишу другую простую программу для добавления 2 массивов (Arraya + arrayB) в arrayC, используя PTHREAD. Вот мой простой код. Все было жестко запрограммировано, не было циклов и таких в 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 сообщений об ошибках вокруг этих линий: (* х) = .arrA Arraya; и такие

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

Вот мои вопросы:

  1. Почему запрещено распайка массивов? И как его решить?
  2. В первой программе выше, я положил pthread_exit (NULL) дважды: в main() и в функции void *. Полагаю, мне нужно только один раз это поставить. Итак, где именно я должен это выразить? В main() или в функции void *?
  3. Обязательно поставить pthread_join в основном() перед возвратом 0?

Благодарим вас заранее. Ваши объяснения будут большой помощью для меня.

Благодаря

P.S .: Я отправляю другой подобный вопрос (о матрице) в разделе ниже.

+0

OT: Существует оператор '->'. – alk

+0

@alk: Я вижу. Спасибо. – izza

+0

Компилятор жалуется, что массив не разрешен с правой стороны оператора присваивания. Что вы пытаетесь сделать с каждой из отмеченных строк кода? –

ответ

0

Ну

  1. Вы не можете непосредственно копировать массивы в С. было объяснено here довольно хорошо.
  2. Точная функциональность pthread_exit четко обозначена here; Примеры также доступны here. То есть вызов должен быть помещен в printNumber (void * x), а не в main().
  3. Точная функциональность pthread_join четко обозначена here. Чтобы передать управление потоку, требуется вызов pthread_join.
+1

@ Roney Michael: Спасибо за ссылки. Кажется, мне еще предстоит изучить Программу Basic C 101. – izza

+1

Я хотел бы поддержать 2 ответа выше, которые очень мне очень полезны, но я до сих пор не имею репутации, чтобы сделать это, извините. Я подниму его позже, когда у меня хватит репутации. ;) – izza

3

А что-то вроде:

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

[...] 

x->arrA = arrayA 
[...] 

pthread_join необходима потому, что вы хотите, чтобы ждать каждого потока должна быть завершена до выхода из приложения.

+1

@ Anthony Catel: Прежде чем я увидел ваш ответ, я решил изменить свою структуру в соответствии с образцом из найденной мной ссылки (вычислительный.engineering.or.id/Matrix/Perkalian) следующим образом: typedef struct {int startIdx ; int (* arrC) [SIZE], (* arrA) [SIZE], (* arrB) [SIZE]; } someType; Но ваше предложение кажется более понятным. Благодарю. – izza

+1

@ Энтони Катель: Ваше предложение работает очень хорошо ... !!! Большое спасибо: D. Я собираюсь написать матрицу mult, используя Pthread. – izza

Смежные вопросы