2016-12-03 124 views
0

3消費者2生產者。讀取和寫入一個緩衝區。 生產者A推動1個元素緩衝(長度N),生產者B推動2個元素緩衝。沒有主動等待。我不能使用System V信號量。對於A公司生產者 - 消費者生產者創造2個要素POSIX信號燈

示例代碼:

void producerA(){ 
    while(1){ 
    sem_wait(full); 
    sem_wait(mutex); 

    Data * newData = (Data*) malloc(sizeof(Data)); 
    newData->val = generateRandomletter(); 
    newData->A = false; 
    newData->B = false; 
    newData->C = false; 

    *((Data*) mem+tail) = *newData; 

    ++elements; 
    tail = (tail + 1) % N; 

    sem_post(mutex); 
    sem_post(empty); 
    } 
} 

消費者看起來很相似,除了他們閱讀或消耗但是這無關緊要。 我有很多與製片B.麻煩很明顯,我不能做這樣的事情

sem_wait(full); sem_wait(full); 

我也試過具有生產B中的不同信號將被調升第一次有2個或更多的自由在緩衝區中的斑點。但是這並沒有奏效,因爲我仍然需要適當降低和增加信號量fullempty

我可以通過哪些方式解決此問題?

+0

條件變量在我看來是你需要的技術。 –

+0

由於我在這個過程中不能有任何主動等待,這意味着我無法在循環的每次迭代中檢查一個條件。如果你有更聰明的東西,我會很感激。 – Aaroneiros

+1

條件變量的重點在於避免主動等待。 –

回答

0

https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20 這將是我遇到的所有問題的解決方案。

TLDR: 我可以提供的最簡單的同步是使用信號量fullempty來表示我推入緩衝區的元素數。但是,如果我有一個創建2個元素的生產者,那麼這種解決方案對於POSIX信號量不起作用。

我的解決方案是一個不同的概念。
進程的輪廓歸結爲:

while(1){ 
    down(mutex); 
    size = get size 
    if (condition related to size based on what process this is) 
    { 
     do your job; 
     updateSize(int diff); // this can up() specific semaphores 
           // based on size 
           // each process has his own semaphore 
     up(mutex); 
    } 
    else 
    { 
     up(mutex); 
     down(process's own semaphore); 
     continue; 
    } 
} 

我希望這將是有人在將來有用。