2

私はPthreadプログラミングの初心者です。

私は以下のコードのように非常に単純な方法でPthreadを使用しようとしていますが、dllファイルとbinファイルを既に含めているので、CodeBlockでうまく機能します。

#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. なぜ配列の禁止された割り当てですか?そしてそれを解決する方法は?
  2. 上記の最初のプログラムでは、pthread_exit(NULL)をmain()とvoid*関数の2回入れています。一度置くだけでいいと思います。それで、私はそれをどこに正確に置く必要がありますか?main()またはvoid *関数で?
  3. 0を返す前にmain()にpthread_joinを入れることは必須ですか?

前もって感謝します。あなたの説明は私にとって大きな助けになるでしょう。

ありがとう

PS:以下のセクションに別の同様の質問(マトリックスについて)を投稿します。

4

2 に答える 2

3

次のようなものはどうですか:

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

[...]

x->arrA = arrayA
[...]

アプリケーションを終了する前にすべてのスレッドが終了するのを待ちたいので、pthread_join が必要です。

于 2013-03-02T16:56:03.410 に答える
0

良い、

  1. C で配列を直接コピーすることは許可されていません。これについては、ここで十分に説明されています。
  2. pthread_exit の正確な機能は、ここで明確に述べられています。例もここで入手できます。つまり、呼び出しは main() ではなく、printNumber(void *x) に配置する必要があります。
  3. pthread_join の正確な機能は、ここで明確に述べられています。そのため、制御をスレッドに渡すには、pthread_join 呼び出しが必要です。
于 2013-03-02T16:48:42.657 に答える