0

對於信號量實現,過程指定了什麼?在生產者/消費者問題的背景下,過程是生產者方法/消費者方法嗎?或者如果我們在P()中並且該值小於0,那麼它是否是P()?混淆信號量定義

 P() { 
       value = value –1; 
       If value < 0 
       add the calling process to this semaphore’s list; 
       block this process 
      } 

例 如果消費者運行第一生產者產生其第一個項目之前

消費者將遞減的全部價值 - >滿= -1 然後因爲該值小於1,這將增加該調用進程到這個信號量的列表。但我不確定過程是什麼。 阻止這個過程是什麼意思?這是否意味着消費者的整個方法處於停止狀態,並且生產者方法運行?

代碼:

#define N 100 
typedef int semaphore; 
Semaphore fullBuffer = 0; // Initially, no item in buffer 
Semaphore empty = N; // Initially, num empty buffer 
Semaphore mutex = 1;  // No thread updating the buffer 

void producer(void) { 
    int item; 
    while(TRUE){ 
     item = produce_item(); 
     down(&empty); 
     down(&mutex); 
     insert_item(item); 
     up(&mutex); 
     up(&full); 
     } 
    } 

void consumer(void) { 
int item; 
while(TRUE){ 
     down(&full); 
     down(&mutex); 
     item = remove_item(); 
     up(&mutex); 
     up(&empty); 
     consume_item(item); 
     } 
} 

回答

3

的方法,在這種用法中,是完全一樣的螺紋。通常,當使用'多進程'而不是'多線程'時,這意味着內核處理線程,這使得計算機可以利用多個內核。然而,這對於這個特定的實現並不重要,對於這個特定的實現也是錯誤的,因爲沒有什麼是原子的。

這裏阻塞進程意味着調用P並將該值減爲任何負值的進程在到達'阻止此進程'命令時會停止自己的執行。

假設多線程,你的'生產者'命令將不斷減少空信號量,除非它試圖將其減小到零以下,在這種情況下它將被暫停,只有'消費者'命令會運行。至少,只有'消費者'會運行,直到它增加了空白的信號量,足以'生產者'現在可以運行。您還可以在前兩個句子中同時切換'空'< - >'full'和'producer'< - >'consumer',並且它們應該保持正確。

此外,我建議您閱讀信號量elsewhere,因爲它們是線程/多處理的基本組成部分,其他人對它們的描述比我所能做到的要好。 (看看那裏的生產者/消費者的例子。)

+0

因此,消費者一旦達到障礙聲明就會「停止」,然後生產者將運行? – 2014-10-12 07:35:42

+0

只有'完整'信號量已經爲零,或'生產者'已經將'互斥量'減少到零時纔有效。生產者可能已經在運行,但它不能被阻止,因爲如果'消費者'被阻塞,那麼它被阻塞,因爲它等待'生產者'增加信號量,這將允許它再次運行。 '生產者'和'消費者'都可以同時運行。 – SimLeek 2014-10-12 18:36:35