1

重複の可能性:
C ++メンバー関数内のPTHREAD_MUTEX_INITIALIZERはコンパイルできませんか?

POSIXスレッドとセマフォでプロデューサー/コンシューマーの問題を実装しようとしていますが、次のエラーに直面しています。

sema.c: In function ‘initialize_variables’:
sema.c:55:8: error: expected expression before ‘{’ token

コードを確認しましたが、このエラーの原因がわかりませんでした。

コードは次のとおりです。

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

#define BUFFER_SIZE 10
#define TRUE 1

pthread_mutex_t mutex;

sem_t full, empty;

int buffer[BUFFER_SIZE];

int counter;

void* producer(void*);
void* consumer(void*);

int insert_item(void);
int remove_item(void);

void initialize_variables();

int main(int argc, char *argv[]) {

    int number_Pro;
    int number_Cons;
    int i;

    if(argc!=3){
        printf("Not enough parameters\n");
        exit(0);
    }

    number_Pro = atoi(argv[1]);
    number_Cons = atoi(argv[2]);

    pthread_t t_array_Pro[number_Pro];
    pthread_t t_array_Cons[number_Cons];

    initialize_variables();

    for(i=0; i<number_Pro; i++)
        pthread_create(&t_array_Pro[i],NULL,producer,NULL);

    for(i=0; i<number_Cons; i++)
        pthread_create(&t_array_Cons[i],NULL,consumer,NULL);

    return 0;
}

void initialize_variables(){

    mutex=PTHREAD_MUTEX_INITIALIZER;

    sem_init(&full,0,0);
    sem_init(&empty,0,BUFFER_SIZE);

    counter = 0;
}

void* producer(void* arg){

    while(TRUE){

        sem_wait(&empty);

        phtread_mutex_lock(&mutex);

            if(insert_item())
                printf("Error in Producer\n");

            else
                printf("Producer produced a new item\n");

        pthread_mutex_unlock(&mutex);

        sem_post(&full);
    }
}

void* consumer(void* arg){

    while(TRUE){

        sem_wait(&full);

        phtread_mutex_lock(&mutex);

            if(remove_item())
                printf("Error in Consumer\n");

            else
                printf("Consumer consumed an item from the buffer\n");

        pthread_mutex_unlock(&mutex);

        sem_post(&empty);
    }
}

int insert_item(void){

    if(counter < BUFFER_SIZE){

        buffer[counter]=1;
        counter++;
        return 0;
    }

    else
        return -1;
}

int remove_item(void){

    if(counter > 0){

        buffer[counter]=0;
        counter--;
        return 0;
    }

    else
        return -1;
}
4

1 に答える 1

1

PTHREAD_MUTEX_INITIALIZERマクロを評価し、コンパイル時のコンテキストで割り当てを行う必要があります。定義ポイントでミューテックスを初期化するか、を使用しますpthread_mutex_init

特に、次の行は次のとおりです。

mutex=PTHREAD_MUTEX_INITIALIZER;

代入式として解析され、その右側に特定の種類の式が必要です(C文法を調べることができますが、実際には非常に簡単に理解できます)。通常、PTHREAD_MUTEX_INITIALIZERマクロは{ initializer-list }[1]に展開されます。C文法では、最初のステートメントを有効にするには、そのような初期化子リストの前に括弧で囲まれた型名が存在する必要があることを指定しています。

もちろん、キャスト式を使用してこれを回避することはできますが、その結果、pthread_mutex_tオブジェクトの状態が無効になります(POSIX標準を正しく読んでいると、未定義の動作になります)。

[1]..{ { 0, 0, 0, 0, 0, 0, { 0, 0 } } }私のシステムなど。

于 2012-10-22T00:11:33.163 に答える