【问题标题】:Does reperforming failed IO operations achieve anything?重新执行失败的 IO 操作有什么用吗?
【发布时间】:2013-12-28 20:25:12
【问题描述】:

我在办公室遇到的一个常见模式是,如果我们的 IO 操作失败,我们会等待一小段时间,然后再试几次,希望它突然开始工作。

我所说的例子:

bool WriteAFile()
{
    uint32_t writeAttempts = 0;
    do
    {
        if (WriteFile(/*...*/))
        {
            break;
        }
        Sleep(50);
        writeAttempts++;
    } while (writeAttempts < 3);
    return writeAttempts < 3;
}

我想这种行为最初是为了防止在处理被另一个进程临时锁定的文件时出现故障......这有点道理......但是,我看不出这如何适用于其他操作。

以这种方式重复 IO 操作是否会增加将“好”数据写入磁盘的机会?它可以用作死亡驱动器的解决方法吗?这种行为还有其他合法用途吗?

PS:虽然我已将此标记为 C++ Windows 示例,但我很想知道是否有任何令人信服的理由也可以在其他语言/平台上执行此操作!

【问题讨论】:

  • 我怀疑这个问题会因为过于主观而被关闭。但是 IMO,不,除非您有特定原因应该重试特定操作,否则您不应该这样做。
  • 我也同意这是一个坏主意,除非你有一个真的很好的理由。想象一下“磁盘海绵”就坐在那里,等待更多磁盘释放,然后醒来并吃掉它......
  • @HarryJohnston,为了清楚起见,我已重命名问题的标题。
  • 您的示例中缺少:超时。重试是所有 i/o 级别的常见模式。它经常起作用。它存在于最低级别的驱动程序中,而在最高级别,它是人类操作员采用的最常见的解决方案。例如,当发送邮件失败时,只需再次发送(我妈妈必须一直这样做,原因不明,但显然与网络有关)。
  • @Cheersandhth.-Alf:示例包含超时 (Sleep(50))

标签: c++ windows io disk


【解决方案1】:

像往常一样……

视情况而定

顺便说一句,这可能是有效/可取的有几个原因:

  • 您正在写入可能无法立即准备好的可移动驱动器
  • 您正在写入的网络驱动器可能会在几毫秒后消失并重新出现(临时网络故障)
  • 完全不同的东西...

有一点几乎可以肯定:这种重试机制不是偶然或随意编码的!

我建议追踪原作者并询问他/她为什么这样做......可能有一个很好的理由,或者最初的原因可能已经过时了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2014-08-22
    • 2015-11-30
    相关资源
    最近更新 更多