首页 > 解决方案 > 使用信号量时忽略 Sleep()

问题描述

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

我的场景:

所以,这是我的实现:

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);
}

我的问题:

标签: csynchronizationforksemaphore

解决方案


//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以便您的访问者同时运行。


推荐阅读