#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
. » ну, нет. И я уверен, что вы знаете. Пожалуйста, будьте более точны при ответе.