簡體   English   中英

如何有效地等待一組信號量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM