以下是我对信号量的理解:
如果你在这里有一个名为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"得到打印然后执行此后的所有代码。 但事实并非如此。之后的任何代码 //*****这里****** 没有立即执行。只有当我将生成器中的其他东西插入缓冲区时才会执行其他临界区。
对不起,很长的帖子。如果有人对可能导致此问题的任何提示有任何提示,请告诉我。 任何帮助都表示赞赏!
答案 0 :(得分:2)
注意 - 你应该清除printf(),否则你可能会得出错误的结论。发生在之前/之后。