생산자/소비자 응용 프로그램을 만들려고합니다. 문제는 제 제작자가 전체 버퍼를 채우는 것입니다. 그러면 소비자가 전체 버퍼를 제거하고 있습니다 ... 생산자가 세마포어에 post
을 작성하자마자 버퍼에서 항목을 제거한다고 가정하지 않았습니까?C에서 sempahore로 제작자 및 소비자 작업
내 코드 :
void* producerFunc(void* arg)
{
while(n_insertions < N_PRODUCTS)
{
sem_wait(&sem_postAvaliable);
sem_wait(&mutex);
//Insert Item
sem_post(&mutex);
sem_post(&sem_posTaken);
}
pthread_exit(NULL);
}
void* consumerFunc(void* arg)
{
while(n_consumed < N_PRODUCTS)
{
sem_wait(&sem_posTaken);
sem_wait(&mutex);
//Remove from bufer
sem_post(&mutex);
sem_post(&sem_postAvaliable);
}
pthread_exit(NULL);
}
n_insertions
버퍼에 삽입 된 항목의 수를 계산하는 글로벌 정수이고;
n_consumed
은 소비자가 버퍼에서 항목을 소비 한 횟수를 계산하는 전역 정수입니다.
세마포어 sem_postAvaliable 및 sem_posTaken을 어떤 값으로 초기화합니까? 또한,'pthread_mutex_t'를 사용하여 뮤텍스를 선언 한 다음'pthread_mutex_lock'과'pthread_mutex_unlock'을 사용하여 해당 뮤텍스를 잠금 해제하고 잠글 수 있습니다. – OiciTrap
@cursillosonline sem_postAvaliable은 내 버퍼의 크기 인 5로 설정됩니다. sem_posTaken은 버퍼 공간이 아직 없기 때문에 0으로 초기화됩니다. pthread_mutex_lock로 확인하겠습니다 (큰 차이는 없습니까?) – PlayHardGoPro