在C中使用信号量的并行进程

时间:2015-04-21 21:16:40

标签: c semaphore

我在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);

1 个答案:

答案 0 :(得分:1)

sem_post不是阻止通话。 sem_wait是阻塞调用。如果在调用sem_wait时信号量的值为零,则调用它的函数将被阻塞。 sem_post用于释放另一个在信号量值为零时阻塞等待sem_wait的线程,但它阻塞自身。 sem_post调用用于唤醒等待sem-wait'的线程。但然后继续,然后两个线程将同时运行(如果你有至少2个逻辑CPU)。如果你希望调用sem_post的线程在那时阻塞,你需要做其他事情(比如添加另一个信号量)。