进程间信号量有时无法按预期工作

时间:2011-12-20 17:48:26

标签: c linux gcc x86 semaphore

我有以下C代码,其中前缀为 sm 的变量由两个进程 proc1 proc2 共享。因此信号量也是共享的。重复调用此代码。因此,如果我说前一个值,那意味着前一个迭代的值。

我在程序中注意到 proc1 有时会通过 sem_wait(sem_f2l),而 proc2 执行 sem_post(sem_f2l)。我注意到这一点,因为 sm_value_proc1 sm_value_proc2 应该在我的程序中具有相同的值,它们也是由printfs用>>确认的。 > 即可。但是,<<< 的printf有时会显示不同的值。不同之处在于 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 个答案:

答案 0 :(得分:2)

也许这是问题中的复制/粘贴错误(你正在使用真实代码中的复制/粘贴,对吧?),但看起来你在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()可以因信号而解锁。