다중 생성자와 다중 클라이언트 간의 통신을 위해 공유 메모리가있는 세마포어를 사용하고 있습니다. 내 시스템에는 "저장된 세마포어"와 "처리 된 세마포어"라는 세 가지 종류의 세마포어가 있습니다.세마포어 집합에서 효과적으로 대기하는 방법?
시스템은 다음과 같이 실행됩니다. 생산자는 지속적으로 데이터를 공유 메모리에 넣은 다음 저장된 세마포어 값을 늘리십시오. 소비자는 저장된 세마포어를 기다리면서 루프에 있습니다. 생산자로부터 데이터를 수신 한 소비자는 이러한 데이터를 처리 한 다음 처리 된 세마포어 값을 증가시킵니다.
이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에 의한 대기 메커니즘과 유사 할 수 있음)을 기다리는 다른 방법이 있다는 것입니다.
희망 답변을 참조하십시오. 정말 고마워!
공유 자원 풀은 하나의 세마포어에 의해 제어되어야하며 집합에 의해 제어되어야합니다. –