2013-03-27 4 views
0

다중 생성자와 다중 클라이언트 간의 통신을 위해 공유 메모리가있는 세마포어를 사용하고 있습니다. 내 시스템에는 "저장된 세마포어"와 "처리 된 세마포어"라는 세 가지 종류의 세마포어가 있습니다.세마포어 집합에서 효과적으로 대기하는 방법?

시스템은 다음과 같이 실행됩니다. 생산자는 지속적으로 데이터를 공유 메모리에 넣은 다음 저장된 세마포어 값을 늘리십시오. 소비자는 저장된 세마포어를 기다리면서 루프에 있습니다. 생산자로부터 데이터를 수신 한 소비자는 이러한 데이터를 처리 한 다음 처리 된 세마포어 값을 증가시킵니다.

for(int i =0;i<nloop;i++){ 
    usleep(100); 
    strcpy(shared_mem[i], "data for processing"); 
    sem_post(&shared_mem[i].stored_semaphored); 
    if(sem_timedwait(&msg_ptr->processed_semaphore,&ts)==-1){ //waiting for result 
     if(errno == ETIMEDOUT){ 
     } 
     break; 
    }else{ 
     //success 
    } 

} 

소비자 코드 :

는 소비자 코드에서 루프입니다
for (int j = 0; j < MAX_MESSAGE; j++) { 
if (sem_trywait(&(shm_ptr->messages[j].stored_semaphore)) == -1) { 
    if (errno == EAGAIN) { 
    } else { 
      //success ==> process data 
      //post result back on the shared memory, and increase       
      //the processed semahore 
     strcpy(shared_mem[j].output, "Processed data"); 
     sem_post(&(shared_mem[j].processed_semaphore)); 
    } 
} 
}//for loop over MAX_MESSAGE 

내 문제가 있음을 생산자는

생산자 코드는 "처리 세마포어"에서 대기하여 결과를 얻을 것이다 프로듀서로부터의 데이터가없는 경우 연속적으로 실행되는 루프이기 때문에 거의 100 % CPU를 낭비합니다.

제 질문은 CPU 시간을 낭비하지 않는 세마포어 집합 (SELECT, POLL 또는 EPOLL에 의한 대기 메커니즘과 유사 할 수 있음)을 기다리는 다른 방법이 있다는 것입니다.

희망 답변을 참조하십시오. 정말 고마워!

+0

공유 자원 풀은 하나의 세마포어에 의해 제어되어야하며 집합에 의해 제어되어야합니다. –

답변

1

나는 세마포어 집합을 기다릴 방법이 없다는 것을 알고있다. 즉, 모든 액세스가 단일 세마포를 통해 수행되어야합니다. 세마포어 집합을 반복하므로 집합 적으로 하나의 객체가 될 수 있습니다. 그 소비자는 어떤 세마포어가 신호를 받았는지 알 필요가 있으므로 새로운 세마포어에 추가로 sem_post을 사용하여 세마포어 세트가 변경되었음을 알립니다.

.... 
sem_post(&shared_mem[i].stored_semaphored); 
sem_post(&list_changed_semaphore); /* Wake the consumer. */ 
.... 

소비자 :

귀하의 생산자 코드는 다음과 같이된다

/* Block until a consumer has indicated that it has changed the semaphore list */ 
if (!sem_wait(&list_changed_semaphore)) { 
    /* At least one producer has signalled a change. */ 
    for (int j = 0; j < MAX_MESSAGE; j++) { 
     if (sem_trywait(&(shm_ptr->messages[j].stored_semaphore)) == -1) { 
     } 
    } 
} 

대신 당신이 뭔가를 표시하기 위해 pthread_cond_t 조건 변수를 사용할 수 list_changed_semaphore에 대한 세마포어를 사용하여 세마포어 세트가 변경되었습니다. list_changed_semaphore은 여기에 표시된 예제와 같이 카운터 일 필요는 없지만 제작자가 목록을 수정했음을 나타내는 단일 비트 일 필요가 있습니다.

+0

필립 : 사려 깊은 답변 주셔서 감사합니다! 그것은 내 문제를 해결했다. – khanhhh89