Я пытаюсь работать с потоками производителя / потребителя в ограниченном буфере.Длина буфера равна 5. У меня есть 1 мьютекс и 2 семафора, пустой, который начинается с размера буфера, и полный, который начинается с 0.
Когда я запускаю свой код без sleep () вконец, он непрерывно производит до тех пор, пока буфер не будет полностью заполнен, потребляет, пока он не станет пустым, поэтому вывод выглядит так:
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.
Однако, когда я запускаю с sleep () в конце, он печатаетout:
Placed 1 in the buffer at position 0.
The buffer now contains 0 at position 0.
Затем кажется, что он заблокирован, но я не совсем уверен, почему он ведет себя так, как он делает, независимо от того, спит или нет.Какие-либо предложения?Мой основной метод по сути просто делает некоторые объявления, затем создает 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);
}
}