我在C中的信号量存在很大问题。以下是我的代码灵感的链接:http://cse.unl.edu/~ylu/csce351/notes/Solution%20for%20Building%20H2O.pdf。
有两种类似的氢和氧代码。这是一个想法:有氧气和氢气生成的过程,它们是在不同的时间产生的。当有2个氢和1个氧时,它们称为函数bond()
。但他们必须等待他们。在将条件评估为false之后,应该切换到另一个进程(或者至少这是我理解它的方式)。但在我的代码中,它继续执行下一个命令,导致它不会等到我需要的所有进程。它会在创建的每个进程之后打印到输出,即使它应该等待。有谁知道那里有什么不对吗?
(如果这还不够,我可以发布更多代码。)
氧代码:(氢气相似)
sem_wait(mutex);
if ((*hydrogen >=2) && (*oxigen>=1))
{
(*count_c)++;
*count_cur_h-=2;
sem_post(hydrel);
sem_post(hydrel);
*count_cur_o-=1;
sem_post(oxrel);
}
else
{
(*count_c)++;
sem_post(mutex); // This is the place where it is supposed
// to release and continue to another process,
// but it goes to the next command.
}
sem_wait(oxrel);
bond();
sem_wait(barrier);
//semaphores are initialized like this:
sem_init(mutex,1,1);
sem_init(oxrel,1,1);
sem_init(hydrel,1,2);
sem_init(barrier,1,3);
答案 0 :(得分:1)
sem_post不是阻止通话。 sem_wait是阻塞调用。如果在调用sem_wait时信号量的值为零,则调用它的函数将被阻塞。 sem_post用于释放另一个在信号量值为零时阻塞等待sem_wait的线程,但它不阻塞自身。 sem_post调用用于唤醒等待sem-wait'的线程。但然后继续,然后两个线程将同时运行(如果你有至少2个逻辑CPU)。如果你希望调用sem_post的线程在那时阻塞,你需要做其他事情(比如添加另一个信号量)。