Sleep () игнорируется при использовании семафоров - PullRequest
0 голосов
/ 05 марта 2019

Я работаю с семафорами для синхронизации процессов.У меня путаница с поведением функций семафора (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))

1 Ответ

1 голос
/ 05 марта 2019
//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, чтобы ваши посетители запускались одновременно.

...