linux SIGTERM无法终止忙碌的等待进程

xzv2uavs  于 2023-04-11  发布在  Linux
关注(0)|答案(1)|浏览(225)

我有一个多线程的设置。其中一个线程在一个原子对象上旋转<size_t>,另一个线程递增。

//global
atomic <size_t> var;

// in thread-1
while(var.load(memory_order_relaxed) == 0)
{
    //busy wait
}
// do something ...

我观察到,如果另一个线程在没有增加var的情况下完成,那么这个进程就不能使用ctrl+c或使用htop中的SIGTERM来杀死。我必须使用SIGKILL来杀死它。为什么会这样?

vd8tlhqk

vd8tlhqk1#

你观察到的行为是由于这样一个事实,即当第二个线程结束时没有递增var,第一个线程继续在一个忙碌的循环中旋转。这个循环不断地检查var的值,因为它没有改变,第一个线程永远不会跳出循环。
当你尝试使用ctrl+c或SIGTERM杀死进程时,进程会被发送一个信号以优雅地终止。然而,第一个线程被卡在忙碌的循环中,没有机会处理终止信号。结果,进程没有按预期退出。
另一方面,SIGKILL强制终止进程,而不给它执行任何清理或处理信号的机会。这就是为什么SIGKILL在您的情况下有效。

相关问题