术语“中断安全”是什么意思?

7

我经常遇到这个术语。现在我真的需要一个清晰的解释,因为我想使用一些被称为不可中断安全的MPI例程。


MPI手册中的典型引用是(反复):“此例程是线程安全的。这意味着可以在没有任何用户提供的线程锁的情况下安全地使用此例程。但是,该例程不是中断安全的。通常,这是由于使用诸如malloc或其他非MPICH运行时例程的内存分配例程本身不是中断安全的原因。”(例如在mpich.org/static/docs/v3.3/www3/MPI_Type_dup.html上)。我也试图找出它的含义。 - alfC
2个回答

8

我认为这是“可重入”的另一种说法。如果一个函数是可重入的,那么它可以在执行过程中被中断并再次调用。

例如:

void function()
{
    lock(mtx);
    /* code ... */
    unlock(mtx);
}

这个函数可以被不同的线程明确地调用(互斥锁将保护代码)。但是如果在lock(mtx)之后接收到一个信号并且再次调用该函数,它将会死锁。因此它不是中断安全的。


1
@RestlessC0bra,你的例子隐含地假设了递归锁,这被一些人认为是不好的。考虑到这一点 - cnicutar
1
假设一个线程获取了互斥锁。然后同一个线程处理一个信号,以某种方式重新开始执行函数(这很常见)。如果锁不是递归的(也不应该是),那么唯一的线程就会死锁。 - cnicutar

2

安全免受中断并发访问的代码被称为中断安全代码。

考虑这样一种情况:您的进程处于临界区,异步事件发生并中断了进程以访问先前被抢占的相同共享资源。

如果在操作资源的代码中间发生中断,并且中断处理程序可以访问相同的资源,则存在重大错误。锁定可以解决这个问题!


OP所提到的完整引用是“线程和中断安全此例程是线程安全的。这意味着该例程可以被多个线程安全地使用,而无需任何用户提供的线程锁。但是,该例程不是中断安全的。通常,这是由于使用诸如malloc或其他非MPICH运行时例程的内存分配例程本身不是中断安全的原因。”(例如在此处:https://www.mpich.org/static/docs/v3.3/www3/MPI_Type_dup.html)。它明确表示(线程)锁不是必需的。 - alfC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接