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

4
我有以下的C代码,其中以sm为前缀的变量被两个进程proc1proc2共享。因此,信号量也是共享的。这段代码会被重复调用。所以如果我说上一次的值,那就是上一个迭代的值。
我注意到在我的程序中,proc1有时会通过sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l)。这是我注意到的,因为在我的程序中,sm_value_proc1sm_value_proc2应该具有相同的值,它们确实如此,也通过带有>>>的printf得到了确认。然而,带有<<<的printf有时显示不同的值。差异是由于proc1打印sm_value_proc2的上一个值,因为proc1神秘地有时候不等待proc2发布sm_f2l
这里出了什么问题?
// 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
也许这是问题中的复制/粘贴错误(您是从真实代码中复制/粘贴的,对吗?),但看起来您在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()可能会因为信号而取消阻塞。


谢谢指出,这不是真正的代码。我已经进行了编辑。 - MetallicPriest
sem_wait可以从哪种信号中解除阻塞? - MetallicPriest
1
任何进程捕获和处理的信号。添加一些代码以检查sem_wait()返回值是否为零。在这种情况下记录情况和/或重试sem_wait() - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接