我有以下的C代码,其中以sm为前缀的变量被两个进程proc1和proc2共享。因此,信号量也是共享的。这段代码会被重复调用。所以如果我说上一次的值,那就是上一个迭代的值。
我注意到在我的程序中,proc1有时会通过sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l)。这是我注意到的,因为在我的程序中,sm_value_proc1和sm_value_proc2应该具有相同的值,它们确实如此,也通过带有>>>的printf得到了确认。然而,带有<<<的printf有时显示不同的值。差异是由于proc1打印sm_value_proc2的上一个值,因为proc1神秘地有时候不等待proc2发布sm_f2l。
这里出了什么问题?
我注意到在我的程序中,proc1有时会通过sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l)。这是我注意到的,因为在我的程序中,sm_value_proc1和sm_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 );
}
sem_wait()
返回值是否为零。在这种情况下记录情况和/或重试sem_wait()
。 - Michael Burr