【发布时间】:2015-04-21 21:16:40
【问题描述】:
我对 C 中的信号量有一个大问题。这是我的代码灵感的链接:http://cse.unl.edu/~ylu/csce351/notes/Solution%20for%20Building%20H2O.pdf。
氢和氧有两个相似的代码。这就是想法:氧气和氢气会产生一些过程,它们是在不同的时间产生的。当有 2 个氢和 1 个氧时,它们调用函数bond()。但他们必须等他们。在条件被评估为假后,它应该切换到另一个进程(或者至少我是这样理解的)。但是在我的代码中,它继续执行下一个命令,这导致它不会等待我需要的所有进程。即使它应该等待,它也会在创建的每个进程之后打印到输出。有谁知道那里出了什么问题?
(如果这还不够,我可以发布更多代码。)
氧气代码:(氢气类似)
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);
【问题讨论】:
-
你如何定义这些互斥体,它们在哪里?它们应该位于共享内存中,因为您正在创建进程之间共享的互斥锁。另外,当你在评论中说继续另一个进程时,你的意思是唤醒另一个进程(等待
mutex)吗?另一件事是,您获得了互斥锁,但仅在 else 条件下才释放它。这是预期的行为吗? -
信号量在共享内存中。我的意思是一直等到不会有2个氢和氧。应该是有意的行为-当您查看链接时,有相同的东西(在我们学校项目中用作参考的“信号量小书”中也有相同的东西)
-
另外,
barrier在您的代码中发布在哪里?您链接中的代码使用mutex.signal()而不是您的代码使用的barrier.wait()。另一个注意事项:sem_post不会切换到另一个进程,调用者将继续运行。链接中的代码似乎依赖于 mutex-acquiring 来停止当前进程。 -
在bond函数中解除了障碍。是的,它使用了barrier.wait,但这只是一个插件。我发布的这段代码用于氧气,氢气的代码使用 mutex.signal()。我知道它不会切换到另一个进程,但它应该释放进程(我认为)。