使用信号量时,sleep()被忽略

时间:2019-03-05 10:50:35

标签: c synchronization fork semaphore

我正在使用信号量来同步进程。我对信号量功能(wait()signal())的行为有些困惑

我的情况:

  • 我有两个循环创建这些进程visitorkeyholder

  • 访客和密钥持有者可以突然到达房屋(无论是 几个同时进行,而有些则延迟了几秒钟 彼此随机)

所以,这是我的实现:

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)之后)

1 个答案:

答案 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代码,以便您的访问者同时运行。