Я пытаюсь работать с потоками производителя/потребителя в ограниченном буфере. Длина буфера равна 5. У меня есть 1 мьютекс и 2 семафора, пустой, который начинается с размера буфера, и полный, который начинается с 0.C - проблема блокировки производителя/потребителя
Когда я запускаю свой код без сна() в конце она постоянно производит до тех пор, пока буфер не полностью полностью, то истребляют, пока он не пуст, поэтому результат выглядит следующим образом:
Placed 1 in the buffer at position 0.
Placed 2 in the buffer at position 1.
Placed 3 in the buffer at position 2.
Placed 4 in the buffer at position 3.
Placed 5 in the buffer at position 4.
The buffer now contains 0 at position 0.
The buffer now contains 0 at position 1.
The buffer now contains 0 at position 2.
The buffer now contains 0 at position 3.
The buffer now contains 0 at position 4.
Однако, когда я бегу со сном() в конце, он печатает:
Placed 1 in the buffer at position 0.
The buffer now contains 0 at position 0.
Затем он заперт, но я не уверен, почему он ведет себя y это независимо от того, есть или нет сон. Какие-либо предложения? Мой основной метод, по сути, просто делает некоторые объявления, а затем создает 1 поток для производства и 1 для потребления, эти методы ниже.
void *producer()
{
int k = 0; //producer index
while (1)
{
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[k] = k+1;
sem_post(&full);
pthread_mutex_unlock(&mutex);
printf("Placed %d in the buffer at position %d.\n", buffer[k], k);
k = (k + 1) % BUFFER_SIZE;
sleep(rand() * 10);
}
}
void *consumer()
{
int j = 0; //consumer index
while(1)
{
sem_wait(&full);
pthread_mutex_lock(&mutex);
buffer[j] = 0;
sem_post(&empty);
pthread_mutex_unlock(&mutex);
printf("The buffer now contains %d at position %d.\n", buffer[j], j);
j = (j + 1) % BUFFER_SIZE;
sleep(rand() * 10);
}
}
Предлагаю вам выбросить код и переписать задачу в псевдокоде. Или вы можете переписать его на C снова, что обычно помогает мне найти такие жесткие ошибки. –
Одна (не связанная) проблема. Я вижу, потребительский индекс 'j' должен делиться между потребителями. Это не помогает, если оно локально для каждого потока. Сделайте 'j' глобальным. –
Спасибо, я на самом деле планировал это сделать, когда я реализую несколько потоков, но пока у меня только 1 производитель и 1 потребитель каждый. – john