【发布时间】: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))