2016-03-07 57 views
1

這裏是我的信號燈的理解:ç信號生產者 - 消費者的關鍵部分

如果你有一個在此稱爲SEM1信號,你有後的一個關鍵部分。然後一旦輸入信號後的代碼就會完全執行。所以,如果你有以下僞代碼:

sem_wait(sem1) 
    //#CRITICAL SECTION 
    //code 1 
    //code 2 
sem_post(sem1) 

然後兩行代碼1,代碼2將沒有任何停止正確執行?即使關鍵部分中有500行代碼是正確的,情況也是如此。

現在,我之所以問這個是因爲我已經從下面的代碼遇到了一個很奇怪的bug:

while (1) { 
     int binary; 
     sem_wait(&shared_mem->bufferUnderflow); 
     printf("we passed the underflow\n"); 
     sem_wait(&shared_mem->binary); 
      sem_getvalue(&shared_mem->binary, &binary); 
      printf("currentIndex is %d",shared_mem->frontBuffer); 
      printf("we passed the binary:%d\n",binary); 
      //*****HERE****** 
      printf("currentIndex is %d",shared_mem->frontBuffer); 
      //if we pass here then we can safely take the Job 
      Job currentJob = shared_mem->jobs[shared_mem->frontBuffer]; 
      printf("we took a job"); 
      int currentIndex = shared_mem->frontBuffer; 
      printf("we took currentIndex"); 
      //change the indeces now that we have popped the latest one 
      shared_mem->frontBuffer = (shared_mem->frontBuffer + 1) % sizeBuffer; 
      printf("we changed the index"); 
      //shared_mem->freeIndex = (shared_mem->freeIndex + 1) % sizeBuffer; 
     sem_post(&shared_mem->binary); 
    sem_post(&shared_mem->bufferOverflow); 
    //consume the Job 
    printf("Printer starts printing %d pages from Buffer[%d]", (currentJob).pages,currentIndex); 
    sleep(currentJob.duration); 

} 
return 0; 
} 

在這裏,我會假設,當行「我們通過二進制:0 「打印出來後,所有的代碼都應該被執行。 但情況並非如此。 // ***** HERE ****** 之後的任何代碼都不會立即執行。它只有當我通過生產者向緩衝區插入其他內容時才執行其他關鍵部分。

對不起,很長的文章。如果任何人有任何暗示可能會導致這種情況,請讓我知道。 任何幫助都很感謝!

+0

你使用現有的信號量庫,還是你自己寫? – callyalater

+0

什麼是默認信號量計數值?爲什麼不只是互斥體(即:count = 1的信號量)? – DevNull

+0

@callyalater好點。如果OP包裝他/她自己的信號調用,它們可能不是原子的。 – DevNull

回答

2

注意 - 你應該清除printf()否則你可能會得出一個錯誤的結論。發生在之前/之後。