【问题标题】:taking an error in a simple producer consumer example when initialize a mutex [duplicate]初始化互斥锁时,在简单的生产者消费者示例中出错 [重复]
【发布时间】:2012-10-22 00:01:01
【问题描述】:

可能重复:
PTHREAD_MUTEX_INITIALIZER inside C++ member function cannot compile?

我正在尝试使用 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;
}

【问题讨论】:

  • 你能检查你在这里输入的代码吗?代码中的拼写错误会产生与您报告的不同的编译器错误。 phtread_mutex_lock(&mutex);应该是 pthread_mutex_lock(&mutex);例如。
  • 请按照常用英语大写您的句子。无论您对此事有何看法,这都是这里的习俗。
  • @pilcrow:我们鼓励您编辑帖子以帮助它们符合我们的 QA 格式。
  • @RobKielty upss 我没看到,谢谢你的回复
  • @quartaela 不用担心 :-) 看起来你得到了一个很好的答案,这是最重要的。

标签: c pthreads posix mutex semaphore


【解决方案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 } } }

【讨论】:

  • 是的,它可以成功编译,使用 pthread_mutex_init 不会出现任何错误。顺便说一下,你能简单解释一下为什么我的方法不能正常工作_?
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 2015-09-25
  • 2019-05-18
  • 2020-10-15
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多