Я использую семафоры с разделяемой памятью для связи между несколькими производителями и несколькими клиентами. В моей системе есть два основных вида семафоров, которые представляют собой «хранимые семафоры» и «обработанные семафоры».как эффективно подождать на семафоре?
Система работает следующим образом: Производители непрерывно помещают данные в общую память, а затем увеличивают значение хранимого семафора, в то время как потребители находятся в цикле, ожидая таких хранящихся семафоров. Потребители после получения данных от производителя будут обрабатывать такие данные, а затем увеличивают значение обработанного семафора. Производители получат свои результаты, ожидая «обработанного семафора»
Код производителя:
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% процессор, потому что в случае отсутствия данных от производителя это для цикла работает непрерывно.
Мой вопрос в том, что существуют другие способы ожидания на множестве семафоров (что может быть похоже на механизм ожидания SELECT, POLL или EPOLL), что не переносит процессорное время.
Надеюсь на ваш ответ. Спасибо!
Общий пул ресурсов должен управляться одним семафором, а не набором. –