gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:36:53 27 4
gpt4 key购买 nike

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

我注意到在我的程序中 proc1 有时会通过 sem_wait( sem_f2l )proc2 不会执行 sem_post( sem_f2l )。我注意到这一点是因为 sm_value_proc1sm_value_proc2 在我的程序中应该具有相同的值,它们确实如此,正如 printfs 和 >>> 。但是,带有 <<< 的 printf 有时会显示不同的值。差异是由于 proc1 打印了 sm_value_proc2 的先前值,因为 proc1 神秘地有时不等待 sm_f2lproc2 发布。

知道这里出了什么问题吗?

// 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() 可以因信号解除阻塞。

关于c - 进程间信号量有时无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com