Межпроцессные семафоры иногда не работают должным образом - PullRequest
4 голосов
/ 20 декабря 2011

У меня есть следующий код C, где переменные с префиксом sm совместно используются двумя процессами proc1 и proc2 .Поэтому семафоры также являются общими.Этот код вызывается неоднократно.Поэтому, если я говорю предыдущее значение, это означает значение предыдущей итерации.

В моей программе я замечаю, что proc1 иногда передает sem_wait (sem_f2l) без proc2 выполняет sem_post (sem_f2l) .Это я замечаю, потому что sm_value_proc1 и sm_value_proc2 должны иметь одинаковое значение в моей программе, что они и подтверждают в printfs с >>> ,Однако printf с <<< </strong> иногда показывает разные значения.Разница заключается в том, что proc1 печатает предыдущее значение sm_value_proc2 , поскольку proc1 таинственным образом иногда не ждет, пока sm_f2l будет опубликовано proc2 .

Есть идеи, что здесь не так?

// semaphores are initialized like this -> sem_init( sm_l2f, 1, 0 );
// Note that sm_l2f and sm_f2l are pointers to sem_t

// sm_condition is assigned here by proc1

if ( is_proc1 )
{
    sem_post( sm_l2f );
    // proc2_value should be updated by now here, but sometimes sem_wait
    //  passes without waiting for proc2 to post sm_f2l!
    sem_wait( sm_f2l );
    if ( sm_condition )
    {
        sm_value_proc1 = calc_value();
        printf( ">>> proc1 value = %u!\n", sm_value_proc1 );

        // If sem_wait and sem_post are working properly, printf will print
        //  the same value for sm_value_proc1 and sm_value_proc2 here, which it 
        //  sometimes doesn't, as the previous value of 
        //  sm_value_proc2 is printed.  
        printf( "<<< proc1 value = %u, proc2 value = %u, barrier_no = %d!\n",
                sm_value_proc1, sm_value_proc2, barrier_no[tid] );
    }
}
else // is proc2
{
    sem_wait( sm_l2f );
    if ( sm_condition )
    {
        sm_value_proc2 = calc_value();
        printf( ">>> proc2 value = %u!\n", sm_value_proc2 );
    }
    sem_post( sm_f2l );
} 

1 Ответ

2 голосов
/ 20 декабря 2011

Возможно, это ошибка копирования / вставки в вопросе (вы используете копирование / вставку из реального кода, верно?), Но похоже, что у вас ошибка в обработке proc2:

// ....

else // is proc2
{
    sem_wait( sm_l2f );
    if ( sm_condition )
    {
        sm_value_proc1 = calc_value();  // <---  this should be assigning to
                                        //       sm_value_proc2
        printf( ">>> proc2 value = %u!\n", sm_value_proc2 );
    }
    sem_post( sm_f2l );
} 

Опять же, может быть, это ошибка копирования / вставки в реальном коде?

Также - не забывайте, что sem_wait() может разблокироваться из-за сигнала.

...