Почему появляется ошибка ‘необъявленный мьютекс’, когда она объявлена в struct?

#c #mutex #semaphore

#c #мьютекс #семафор

Вопрос:

Я создаю файлы производителя и потребителя, используя семафоры для синхронизации. Я создал структуру, в которой я определяю переменные sem_t. Одной из переменных sem_t является мьютекс. Мьютекс означает взаимное исключение. Однако при компиляции моего кода я получаю сообщение об ошибке, в котором говорится, что ‘mutex’ не объявлен. Для меня это не имеет значения, поскольку я думал, что объявляю это в struct.

Я попытался инициализировать переменную значением 1 и использовать другие методы для использования переменной, такие как sem_wait() и wait().

 #define BUFFER_SIZE 10
typedef struct{
    int buffer[BUFFER_SIZE];
    int in;
    int out;
    sem_t mutex;
    sem_t cnt_filled;
    sem_t cnt_empty;
} shm_structure;
  
 /* pointer to shared memory object */
shm_structure *ptr;

ptr->in = ptr->out = 0;

    fp = fopen("input.txt", "r");
    //cnt_empty = 
    //mutex = 1;

    do {
        /* produce an item in next_produced */

        while(((ptr-> in   1) % BUFFER_SIZE) == ptr->out) {
            ; // do nothing
        }

        wait(cnt_empty);
        wait(mutex);

        if(fscanf(fp, "%d", amp;item) != EOF) {
            ptr->buffer[ptr->in]= item;
            printf("%s Read %d from the filen", get_time(), item);
            ptr->in = (ptr->in   1) % BUFFER_SIZE; //increment tell the end of the file
        } else {
            break;
        }

        /* add next_produced into the buffer */

        signal(mutex);
        signal(cnt_filled);
        //sem_post(mutex);
        //sem_post(cnt_filled);

    } while(1);

    fclose(fp);

    return 0;
  

В моем коде не должно быть ошибок при его компиляции. Это единственный результат, который я ищу на данный момент.

Комментарии:

1. Вы должны обращаться к нему из экземпляра этой структуры.

2. Как говорится в ошибке, у вас есть переменные ( cnt_empty , mutex , cnt_filled ), но они нигде не определены в опубликованном вами коде. Кроме того, signal() и wait() не имеют ничего общего с семафорами…

3. ptr предположительно является указателем на shm_structure . Вы, вероятно, хотите использовать его поля вместо независимых переменных.

4. Измените wait(cnt_empty); на wait(ptr->cnt_empty); и wait(mutex) на wait(ptr->mutex); .

5. @JohnBode Я не уверен, wait и signal в какие именно функции они захотят передавать sem_t аргументы.

Ответ №1:

Когда вы объявляете struct, вы определяете агрегированный тип данных. Теперь вам нужно создать экземпляр этой структуры, и тогда вы сможете получить доступ к элементам структуры. Для базового примера того, как использовать элементы struct:

 typedef struct{
    int x;
    int y;
} my_struct;

my_struct my_instance_of_struct;
my_instance_of_struct.x = 1;
  

Комментарии:

1. Спасибо. Это решило проблему с необъявленным мьютексом. Однако, знаете ли вы, почему я получаю ошибку ‘несовместимые типы при назначении’? my_instance_of_struct.mutex = 1 кажется совместимым, потому что это просто переменная в struct, использующая экземпляр struct.

2. Я рекомендую вам взглянуть на комментарии Шона к вашему вопросу, в которых указывается, что ptr это, вероятно, указатель на экземпляр вашей структуры. После этого я бы рекомендовал ознакомиться с документацией для семафоров POSIX. Мой ответ предназначен не для того, чтобы конкретно охватывать использование семафоров, а для доступа к элементам структуры.

Ответ №2:

     signal(mutex);
  

Здесь вы получаете ошибку, потому что mutex не объявлено. Скорее вам нужно сделать shm_structure.mutex .

Комментарии:

1. » Скорее вы должны сделать shm_structure.mutex . » ну, нет. И я уверен, что вы знаете. Пожалуйста, будьте более точны при ответе.