我正在使用信号量来同步进程。我对信号量功能(wait()
和signal()
)的行为有些困惑
我的情况:
我有两个循环创建这些进程visitor
和keyholder
:
访客和密钥持有者可以突然到达房屋(无论是 几个同时进行,而有些则延迟了几秒钟 彼此随机)
所以,这是我的实现:
id=fork();
if(id==0)
{
//create process for each visitor
for(i=0; i<visitor; i++)
{
int v_id=fork();
if(v_id==0)
{
wait(visitor_sem);//visitor_sem value starts at 10(10 visitors)
visitorArrives();
sleep(2); //this sleep works fine
}
else{
wait(NULL);
}
}
for(j=0; j<visitor;j++){
wait(NULL);
}
}
else
{
//create process for each keyholder
for(i=0; i<keyholder; i++)
{
int k_id=fork();
if(k_id==0)
{
wait(key_sem); //key_sem value starts at 3 (3 keyholders)
keyholderArrives();
sleep(5); //this sleep is ignored for some reason
}
}
for(j=0; j<keyholder;j++){
wait(NULL);
}
wait(NULL);
}
我的问题:
sleep()
似乎在我的子流程中无济于事;而对父母没有影响。
我何时应该signal()
?当我尝试使用signal()
时,该过程最终会无限循环(即我将signal(visitor_sem)
放在sleep(2)
之后)
答案 0 :(得分:1)
//create process for each visitor
for(i=0; i<visitor; i++)
{
int v_id=fork(); // AA
if(v_id==0)
{
wait(visitor_sem); // BB
visitorArrives();
sleep(2); //this sleep works fine
}
else{
wait(NULL); // CC
}
}
for(j=0; j<visitor;j++){
wait(NULL); // DD
}
目的是在AA
处创建一堆新流程。每个新创建的进程都成为BB
的访问者。然后,在创建所有访问者之后,我们等待他们在DD
处完成。一切都说得通。
但是CC
的等待是什么?在点fork
处调用AA
的过程需要继续循环以创建下一个访问者。它迫不及待希望刚创建的访问者在CC
时完成工作-这就是DD
的目的!
在else{wait..
点消除CC
代码,以便您的访问者同时运行。