Я и мой друг в настоящее время работаем над основными примерами многопоточности для университета в c. Мы должны решить проблему производителя / потребителя с помощью многопоточного буфера. У нас есть рабочая версия, использующая мьютекс и условные переменные, но при попытке решить эту проблему с помощью семафоров и мьютекса возникли три основные проблемы.
Задача 1 : если мы сначала запустили потребителя, он иногда случайным образом потребляет неверный символ и вылетает.
Проблема 2: Если мы сначала запускаем производителя, он иногда не производит никаких символов до тех пор, пока не будет запущен потребитель, что приводит к проблеме 1.
Проблема 3: Наши производители не заполняют весь буфер, после каждой вставки в буфер потребителя, независимо от того, сколько производителей есть.
В соответствии с нашими примерами псевдокодов, по крайней мере, проблемы 2 и 3 не должны существовать. Я очень благодарен за любые ответы, так как в настоящее время я не могу найти ошибку.
Потребитель:
void *consumer_sem(void *args) {
printf("cons started\n");
char c;
while (cons_running) {
sem_wait(occupied);
pthread_mutex_lock(&mutex);
c = consume();
pthread_mutex_unlock(&mutex);
sem_post(free);
printf("consumer consumed %c\n\n", c);
sleep(2);
}
}
Производитель:
void *producer1_sem(void *args) {
printf("prod1 started\n");
char c;
int index=0;
while (prod1_running) {
c = lowercase[index];
index=next(index);
sem_wait(free);
pthread_mutex_lock(&mutex);
add(c);
pthread_mutex_unlock(&mutex);
sem_post(occupied);
printf("producer1 produced something!\n");
printf("%d elements in buffer\n\n",getElemsInBuffer());
sleep(3);
}
}
главный:
sem_t *occupied, *free;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int main(void) {
occupied=sem_open("/occupied", O_CREAT, 0644, 0);
free=sem_open("/free", O_CREAT, 0644, BUFFER_SIZE);
//some unrelated code called
pthread_create(&thread_ids[0], NULL, producer1_sem, NULL);
pthread_create(&thread_ids[1], NULL, producer2_sem, NULL);
pthread_create(&thread_ids[2], NULL, consumer_cond, NULL);
}