0

有什么方法可以检测函数或线程是否阻塞?我想构建一个测试用例,我可以在其中测试一个函数是否是硬实时安全的。

4

2 回答 2

0

不,这是不可能的。考虑这个函数:

unsigned compute(unsigned x)
{
    while (x < 10) {
        if (x) {
            x++;
        }
    }
    return x;
}

它将在有限时间内运行,除非x为零,在这种情况下它将花费无限时间。

由于Halting Problem,您无法确定您的程序中是否存在此类功能。

如果您只需要确定您的程序是否调用您已确定为阻塞的特定系统函数,例如网络 I/O,您可以通过在这些受限系统函数周围插入(通过或类似的链接技巧)包装函数LD_PRELOAD来做到这一点。-fwrap例如,您可以编写一个包装器来recv()检查文件描述符是非阻塞的,EINVAL否则返回。

请注意,在许多系统上,磁盘 I/O 基本上是一种阻塞操作,因此您需要完全禁用它。

于 2017-07-23T11:55:46.267 回答
0

不,没有通用的方法可以做到这一点。

有许多“阻塞”方法,例如自旋锁和类似的“尝试失败重试”算法,但没有切实可行的方法来检测哪些代码“阻塞”。

看看类似顺序锁的东西。这是一个永远不会阻塞(单个)写入器的锁,但如果读取器在写入期间进行了读取(因此可能读取了损坏的值),则会导致读取器重试。

它在读者中的扩展性非常好,尤其是在写入相对不频繁的情况下。当然,重要的一点是阅读器不会相互阻塞,因此随着阅读器的扩展,读取的延迟是一个固定值。

它是否在技术上是无锁的,并且肯定不可能编写一个工具来分析算法并确定它是否是无锁的或者它在什么时候(逻辑上)阻塞是有争议的。

于 2017-07-23T11:51:26.730 回答