我正在使用带有共享内存的信号量在多生产者和多客户端之间进行通信。我的系统中有两种主要的信号量,分别是“存储的信号量”和“处理的信号量”。
系统运行如下:生产者不断地将数据放入共享内存,然后增加存储的信号量的值,而消费者则在循环中,等待存储的信号量。消费者在收到生产者的数据后,会对这些数据进行处理,然后增加处理后的信号量的值。生产者将通过等待“已处理的信号量”来获得结果
生产者代码:
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
我的问题是消费者代码中的 for 循环几乎浪费了 100% 的 CPU,因为在没有来自生产者的数据的情况下,这个 for 循环会连续运行。
我的问题是,还有其他方法可以等待一组信号量(可能类似于 SELECT、POLL 或 EPOLL 的等待机制),这不会浪费 CPU 时间。
希望看到你的回答。非常感谢!