我有一个多线程的设置。其中一个线程在一个原子对象上旋转<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来杀死它。为什么会这样?
1条答案
按热度按时间vd8tlhqk1#
你观察到的行为是由于这样一个事实,即当第二个线程结束时没有递增var,第一个线程继续在一个忙碌的循环中旋转。这个循环不断地检查var的值,因为它没有改变,第一个线程永远不会跳出循环。
当你尝试使用ctrl+c或SIGTERM杀死进程时,进程会被发送一个信号以优雅地终止。然而,第一个线程被卡在忙碌的循环中,没有机会处理终止信号。结果,进程没有按预期退出。
另一方面,SIGKILL强制终止进程,而不给它执行任何清理或处理信号的机会。这就是为什么SIGKILL在您的情况下有效。