2017-05-11 9 views
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); 

    } 
+0

카운트, 세 개의 세마포어 및 버퍼 공간은 모두 하나의 'PCqueue'구조체에 속합니다. 초기화 된 함수를 리턴하는 함수가 필요하다. 구조체는 임의의 스레드 스택에서 쉽게 올릴 수 있습니다. – ThingyWotsit

+0

게시 된 코드가 모든 세마포를 구현하지 않았습니다. 결과로 나오는 'race'조건은 손상된, 손실 된, 중복 된 데이터를 가져올 것입니다. – user3629249

답변

1

일반적인 방법이 있습니다. 대부분의 스레드 라이브러리 (POSIX pthread, Windows CreateThread 등)는 생성시 스레드로 전달되는 데이터 형식에 대한 void 포인터를 허용하여이를 지원합니다. 즉 스레드 콜백 함수의 "arg"매개 변수가 사용됩니다.