3 потребителя 2 производителя. Чтение и запись в один буфер. Производитель A помещает 1 элемент в буфер (длина N), а производитель B помещает 2 элемента в буфер. Нет активного ожидания. Я не могу использовать семафоры System V.
Пример кода для производителя A:
void producerA(){
while(1){
sem_wait(full);
sem_wait(mutex);
Data * newData = (Data*) malloc(sizeof(Data));
newData->val = generateRandomletter();
newData->A = false;
newData->B = false;
newData->C = false;
*((Data*) mem+tail) = *newData;
++elements;
tail = (tail + 1) % N;
sem_post(mutex);
sem_post(empty);
}
}
Потребители выглядят одинаково, за исключением того, что они читают или потребляют, но это не имеет значения. У меня большие проблемы с продюсером Б. Очевидно, я не могу делать такие вещи, как
sem_wait(full); sem_wait(full);
Я также попытался использовать другой семафор для производителя B, который будет повышаться в первый раз, когда в буфере есть 2 или более свободных места. Но это не сработало, потому что мне еще нужно правильно уменьшить и увеличить семафоры full
и empty
.
Какими способами я могу решить эту проблему?