C信号量生产者 - 消费者关键部分

时间:2016-03-07 17:30:16

标签: c semaphore producer-consumer critical-section

以下是我对信号量的理解:

如果你在这里有一个名为sem1的信号量,并且你有一个关键部分。然后,一旦输入信号量后的代码,它将完全执行。所以如果你有以下伪代码:

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

然后两行代码1,代码2将被执行而没有任何停止正确吗?即使在关键部分有500行代码也是如此,对吗?

现在,我之所以这么说是因为我在以下代码中遇到了一个非常奇怪的错误:

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"得到打印然后执行此后的所有代码。 但事实并非如此。之后的任何代码     //*****这里****** 没有立即执行。只有当我将生成器中的其他东西插入缓冲区时才会执行其他临界区。

对不起,很长的帖子。如果有人对可能导致此问题的任何提示有任何提示,请告诉我。 任何帮助都表示赞赏!

1 个答案:

答案 0 :(得分:2)

注意 - 你应该清除printf(),否则你可能会得出错误的结论。发生在之前/之后。