[英]how to wait effectively on a set of semaphore?
我正在使用帶有共享內存的信號燈,以在多生產者和多客戶之間進行通信。 我的系統中有兩種主要的信號量,分別是“存儲的信號量”和“已處理的信號量”。
系統運行如下:生產者連續將數據放入共享內存中,然后在使用者處於循環中時增加存儲的信號量的值,等待此類存儲的信號量。 消費者從生產者那里收到數據后,將處理這些數據,然后增加處理后的信號量的價值。 生產者將通過等待“已處理信號量”來獲得結果
生產者代碼:
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時間。
希望看到你的答案。 非常感謝!
據我所知,還沒有辦法等待一組信號量。 這意味着所有訪問都需要通過單個信號量進行傳遞。 您正在遍歷一組信號量,因此它們可以共同成為一個對象。 該消費者需要知道何時發出了任何信號量,因此請在新信號量上使用附加的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) {
}
}
}
可以不使用list_changed_semaphore
的信號量, list_changed_semaphore
可以使用pthread_cond_t
條件變量來表示信號量集中的某些內容已更改。 list_changed_semaphore
不需要是一個計數器(如此處所示的示例),只需要一個位即可指示生產者已修改了列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.