0
현재 코드가 생산자 소비자 질문에 대답하지만 다른 방식으로 구현하려고합니다. 전역 변수를 사용하여 버퍼 스택의 카운트를 추적하고 싶지 않습니다. 내 사고 과정은 어떻게되어야합니까? 전역 변수가없는 스레드로 세마포를 구현하는 방법
typedef int semaphore;
semaphore mutex, full, empty;
int count = 0;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
int buffer[N];
이
매개 변수로 스레드에 의해 사용되는 변수를 전달하는int remove_item()
{
int ret = buffer[--count];
buffer[count] = 0;
return ret;
}
void insert_item(int item)
{
buffer[count++] = item;
}
int produce_item(){
int item = rand()%50 +1;
printf("Producer produces %d\n",item);
sleep(1);
return item;
}
수
를 사용하는 함수 그리고 내 생산자 소비자 기능void* consumer(void * arg) {
int item = 0;
while(1){
down(full);
down(mutex);
item = remove_item();
buffer[count++] = item;
up(mutex);
up(empty);
consume_item(item);
}
return 0;
}
void* producer(void* arg) {
int item, i =0;
while(1){
item = produce_item();
down(empty);
down(mutex);
insert_item(item);
up(mutex);
up(full);
sleep(1);
}
카운트, 세 개의 세마포어 및 버퍼 공간은 모두 하나의 'PCqueue'구조체에 속합니다. 초기화 된 함수를 리턴하는 함수가 필요하다. 구조체는 임의의 스레드 스택에서 쉽게 올릴 수 있습니다. – ThingyWotsit
게시 된 코드가 모든 세마포를 구현하지 않았습니다. 결과로 나오는 'race'조건은 손상된, 손실 된, 중복 된 데이터를 가져올 것입니다. – user3629249