进程间信号量有时不像预期的那样工作

我有以下C代码,其中以sm为前缀的variables由两个进程proc1proc2共享。 因此信号量也是共享的。 这个代码被重复调用。 所以如果我说以前的价值,这意味着以前的迭代的价值。

我注意到在我的程序中, proc1有时会传递sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l) 。 这我注意到,因为sm_value_proc1sm_value_proc2应该在我的程序中具有相同的值,这也是由printfs用>>>确认的。 但是,使用<<<的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 ); } 

也许这是一个复制/粘贴错误的问题(你正在使用从实际代码复制/粘贴,对吗?),但它看起来像你有一个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()可以解除阻塞。