与信号量定义混淆

时间:2014-10-12 02:30:48

标签: c++ operating-system synchronization semaphore producer-consumer

对于信号量实现,进程指定了什么?在生产者/消费者问题的背景下,生产者方法/消费者方法的过程是什么?或者,如果我们在P()中并且该值小于0,它是P()吗?

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

实施例 如果Consumer在Producer生成第一个项目之前先运行

消费者会减少全部价值 - &gt;满= -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);
      }
}

1 个答案:

答案 0 :(得分:3)

在这种用法中,一个过程就像一个线程。通常在“多重过程”时#39;用来代替多线程&#39;,它意味着内核处理线程,这允许计算机利用多个核心。但是,这对于这个特定的实现并不重要,对于这个特定的实现也是错误的,因为没有什么是原子的。

在此处阻止进程意味着调用P并将值递减为负值的进程将在其到达“阻止此进程”时暂停其自身的执行。命令。

假设多线程,您的生产者&#39;命令将不断减少空信号量,除非它试图将其减少到零以下,在这种情况下它将被暂停,并且只有“消费者”#39;命令将运行。至少,只有&#39;消费者&#39;将运行,直到它增加空信号量足以使生产者&#39;现在可以运行了。您也可以同时切换“空”&#39;&lt; - &gt;&#39;完整&#39;和&#39;生产者&#39;&lt; - &gt;&#39;消费者&#39;在前两句中,它们应该保持正确。

另外,我建议你阅读信号量elsewhere,因为它们是线程/多处理的基本部分,而其他人已经比我更好地描述了它们。 (请查看那里的生产者/消费者示例。)