我正在使用信号量来同步进程。我对信号量函数的行为感到困惑(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)
)//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
代码,以便您的访问者同时运行。