Los semáforos entre procesos a veces no funcionan como se esperaba

Tengo el siguiente código C, donde las variables con el prefijo sm son compartidos por dos procesos proc1 y proc2. Por lo tanto, los semáforos también se comparten. Este código se llama repetidamente. Entonces, si digo valor anterior, eso significa el valor de una iteración anterior.

Noto en mi programa que proc1 a veces pasasem_wait (sem_f2l) sin proc2 ejecutándosesem_post (sem_f2l). Esto lo noto porque sm_value_proc1 y sm_value_proc2e supone que @ tienen el mismo valor en mi programa, que son, como también lo confirman los printfs con >>>. Sin embargo, el printf con <<< a veces muestran valores diferentes. La diferencia se debe a proc1 imprimir el valor anterior de sm_value_proc2 ya que proc1 misteriosamente a veces no espera a sm_f2l será publicado por proc2.

¿Alguna idea de lo que está pasando mal aquí?

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta