使用信号量时忽略Sleep()

问题描述 投票:0回答:1

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

© www.soinside.com 2019 - 2024. All rights reserved.